Newsgroup: it.comp.www.php
Titolo: array & string

Buonasera a tutti, studio il PHP da qualche giorno e` incontro tantissime difficolta`, tra le quali:
 
ho un array {$a} cosi` composto:
$a = array('banane' => 1, 'lamponi' => 2, 'mele' => 3, 'fragole' => 4);
 
vorrei attraverso uno statemets che non conosco, cambiare il value alle keys, in modo tale da ottenere questo risultato:
$a = array('banane' => 2, 'lamponi' => 3, 'mele' => 4, 'fragole' => 1);
 
oppure anche questo:
$a = array('banane' => 4, 'lamponi' => 1, 'mele' => 2, 'fragole' => 3);
 
praticamente far ruotare i value mantenendo le keys dell`array:
con array_push($pairs, array_shift($pairs)); perdo i valori delle chiavi :(
 
un'altra domanda e`: 
avendo una stringa di N char (variabile) mettiamo 98 caratteri...
come faccio a scrivere banane fino ad equaliare la lunghezza della stringa precedente?
 
chiedo scusa se la domanda e` stupida... tuttavia sono desideroso di imparare!
 
--
Pasquale.
 

 come faccio a scrivere banane fino ad equaliare la lunghezza della stringa precedente?
 
qui ne sono venuto a capo in modo, penso, sporco:
$s = 'PER ME SI VA TRA LA PERDUTA GENTE. GIUSTIZIA MOSSE IL MIO ALTO FATTORE: FECEMI LA DIVINA PODESTATE, LA SOMMA SAPIENZA E L PRIMO AMORE';
$r = 'DANTE';
 
$sr = str_repeat("$r", strlen($s));
echo $s . "\r\n";
echo substr($sr, 0, strlen($s));
 
ora pero` mi sorge un altro dubbio e se fossero numeri?
come posso fare la somma senza riporto di una stringa?
 
ad es:
 
n)123456789
+)987654321
-----------
t)000000000
 
??
 
--
Pasquale.
 

 qui ne sono venuto a capo in modo, penso, sporco:
 
cosi` va meglio?:
 
$s = 'Frutta e verdura rappresentano la seconda fonte di vitamina E';
$r = 'fave';
echo $s . "\r\n";
echo substr(str_repeat($r, strlen($s)), 0, strlen($s))
 
--
Pasquale.
 

come faccio a scrivere banane fino ad equaliare la lunghezza della stringa precedente?
 
Non ho capito la domanda. Vuoi scrivere "bananebananebanane...bana"?
 
Ti puo' convenire usare str_repeat() e troncare il risultato con substr().
 
Leonardo
 
-- 
A stultis ex omnibus gentium varie pictis
A sanctae fidei adeptis, ab eorum odore;
AB insanis Iacobinis, ab eorum ardore
AB idolatris et martyribus odii et terroris;
A paradisi fautoribus dicentibus "est pro amore",
A manichaeis ululantibus "Nisi nobiscum prodes";
LIBERA, libera, libera, libera nos, Domine.

come posso fare la somma senza riporto di una stringa?
 
Facilmente non puoi. Se volessi (faccio un esempio <g>) implementare qualcosa
di simile al cifrario di Vigenère, ti conviene farlo usando la funzione XOR a
livello di singolo byte.
 
Se no puoi usare strpos() per determinare la posizione di ogni carattere, sia
numerico sia alfabetico, in una stringa alfabetica standard contenente solo i
caratteri ammessi, e poi usare un'operazione di modulo:
 
	$cipher = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789...";
 
	$s	= "PER ME SI VA...";
	$verme	= "DANTE";
 
	$p1 = strpos($cipher, 'P');
	$p2 = strpos($cipher, 'D');
	$p3 = ($p1 + $p2) % strlen($cipher);
 
	$c	= substr($cipher, $p3, 1); // "T"


 livello di singolo byte.
 
Sig. Leonardo Lei e` un veggente! 
e` esattamente il compito che devo portare entro mercoledi`
il cifrario di vic pero` per sorprendere il prof, voglio implementare il concetto di rotori della macchina enigma, facendo saltare gli array da N a N in funzione del value della keys... cosi` dovrebbe essere molto piu` complicato analizzare il codice.
 
grazie!
 
-- 
Pasquale.

 Ti puo' convenire usare str_repeat() e troncare il risultato con substr().
 
e` proprio quello che ho fatto!:
 
$s = 'Frutta e verdura rappresentano la seconda fonte di vitamina E';
$r = 'fave';
echo $s . "\r\n";
echo substr(str_repeat($r, strlen($s)), 0, strlen($s));
 
oh! spero che il Prof. non mi sgami, altrimenti mi invalida il compito!
 
-- 
Pasquale. 

 
 
 
-- 
Pasquale.

 caratteri ammessi, e poi usare un'operazione di modulo:
[CUT]...
 
guarda ho risolto in maniera facile e rapidissima, ho convertito la stringa in array e ho sommato gli indici XD, quattro righe di codice in tutto.
di questa soluzione sono contento, mi sembra abbastanza accettabile, tu cosa dici?:
 
 
 
$arr0 = str_split($risultato);
$arr1 = str_split($moltiplicatore);
 
for($i=0;$i<count($arr0);$i++) {
$finale .= substr($arr0[$i] + $arr1[$i], -1);
}
echo "\$f:" . $finale;
 
-- 
Pasquale.

di questa soluzione sono contento, mi sembra abbastanza accettabile, tu cosa dici?
 
Dico che mi sa che non l'hai provata. $arr0[$i] + $arr1[$i] e' la richiesta di
una somma fra interi, ma siccome tu gli passi stringhe, queste sono convertite
in intero: per esempio "D" diventa 0, "A" diventa 0, "N" diventa 0 e cosi' via
- sicche' la stringa finale dovrebbe essere sempre "000000000".
 
Inoltre, la semplice somma non ti serve; +N non e' un isomorfismo su ASCII. Se
per esempio hai un corpo come A...Z e usi AAAA come verme, scopri che non puoi
criptare "AZZO", perche' la A diventa B, la O diventa P, ma la Z da' errore, o
ti diventa {, che e' fuori dal corpo. Z+A deve fare di nuovo A, e questo te lo
puo' dare una operazione come il modulo:
 
	chr(((ord($a)-ord($corpus[0])+ord($b)-ord($corpus[0]))
	% strlen($corpus)) + ord($corpus[0]));
 
Es. il corpus e' A...Z; usi XKCD come verme, e vuoi criptare AZZO.
 
	ord(A) ti da' 65, ord($corpus[0]) e' anche questa 65, quindi hai 0.
	ord(X) e' 88, meno 65 fa 23.
	A + X quindi e' 0 + 23 e fa 23. Modulo 26 (la lunghezza del corpus)
	ti da' di nuovo 23. Sommi 65 (ord(corpus[0])), e viene 88. Chr() ti
	restituisce X.
 
Come seconda lettera hai Z, e il verme e' K.
 
	Z vale 25, K 10; 35 modulo 26 fa 9, ossia J.
 
Terza lettera: Z, verme C.
 
	25 + 2 = 27, modulo 26 fa 1, ossia B.
 
Quarta lettera: O, verme D.
 
	14 + 3 = 17, modulo 26 resta 17, ossia R.
 
Codice crittografato: XJBR.
 
Per decifrare, conoscendo il verme, fai i conti all'indietro. E per sicurezza
sommi 26, che e' neutro rispetto al modulo e ti elimina i numeri negativi.
 
Per es. la R (corrispondente al verme D):
 
	17 - 3 + 26 = 40, 40 % 26 = 14, 14 è la lettera O.


 puo' dare una operazione come il modulo:
 
Ciao!, si` hai ragione, tuttavia io sto implementando il "chiper vic" che appunto prevede numeri interni e non test ASCII.
 
<?php
 
header('content-type:text/plain'); 
 
$risultato      = '536471375'; //OLISMO 
$moltiplicatore = '012601260'; //keyword
$arr0 = str_split($risultato);
$arr1 = str_split($moltiplicatore);
 
print_r($arr0); // Array ( [0] => 5 [1] => 3 [2] => 6 [3] => 4 [4] => 7 [5] => 1 [6] => 3 [7] => 7 [8] => 5 )
 
print_r($arr1); // Array ( [0] => 0 [1] => 1 [2] => 2 [3] => 6 [4] => 0 [5] => 1 [6] => 2 [7] => 6 [8] => 0 )
 
for($i=0;$i<count($arr0);$i++) {
$finale .= substr($arr0[$i] + $arr1[$i], -1);
}
 
echo "\$f:" . $finale; // $f:548072535
 
 
/**
* 536471375
* 012601260
*-----------
* 548072535
*/
 
 
Scusa ma sono stanco, domani guardo il resto, grazie.
Buona serata.
 
 
-- 
Pasquale.

 sto implementando il "CIPHER vic" che appunto prevede numeri INTERI e non TESTO ASCII.
 
ammesso e concesso che questo abbia un qualche senso se solo considerassi la tipizzazione, resta inteso che gli interi sono in qualche modo codificati nello charset ma cio` diveterebbe ricorsivo, o no? :-)
 
comunque questa mattina consegno, l'accrocchio sembra funzionare e questo e` gia` qualcosa. :-)
 
-- 
Apriamo le proprieta' della classe System.Helder. State attenti. Se osservate bene, il metodo MoveAttribute e' readonly. In effetti potremmo chiederci la ragione di quest'apparente complicazione: e' una semplice convenzione. Ora fate attenzione: se siete ancora svegli, l'attributo MoveMember e' public. Perche' questo? Eh, non e' facile, ma la risposta giusta e' "Dipende".
Pasquale.