Sostituzione dell'array nel ciclo foreach con l'array modificato nello stesso loop
Domanda
foreach($arrayOne as $value){
do function
}
Nell'esempio precedente, vorrei passare $ arrayOne in un ciclo, fare in modo che una funzione rimuova alcuni elementi di $ arrayOne e quindi far passare il ciclo sopra $ arrayOne ridotto sugli elementi che rimangono fino al loop restituisce false.
Raccomandazioni?
Soluzione
Se si desidera apportare modifiche al valore degli elementi dell'array, utilizzare come riferimento. Se desideri rimuovere completamente gli elementi dell'array, suddividi le coppie chiave / valore.
$arrayOne = array('example', 'listing of', 'stuff');
foreach ($arrayOne as $key => &$value) {
$value .= ' alteration';
if ($value == 'listing of alteration') {
unset($arrayOne[ $key ]);
}
}
Il codice sopra aggiungerà il testo " alterazione " alla fine di ogni elemento dell'array. Rimuoverà anche il secondo indice quando corrisponde a "elenco di modifiche". Testato su PHP 5.2
Altri suggerimenti
Hai solo bisogno di una funzione per rimuovere alcuni elementi di un array?
In tal caso, puoi utilizzare array_filter .
consiglierei di avere due array,
uno con i dati - dataarray,
l'altro inizialmente vuoto - emptyarray
e qualunque cosa si qualifichi nel primo foreachloop, spingi nel secondo array e, alla fine, svuoti il ??primo array, scambia gli identificatori dei due array (l'array di dati diventa array vuoto e viceversa) e ripeti finché non restituisci false o qualunque cosa
Rabbit ha la risposta giusta per usare i riferimenti per modificare i valori e l'indice da annullare in un ciclo foreach (vorrei votarti, ma questo è il mio primo post, quindi non ho ancora 15 rep, scusami)
ricordati di usare il riferimento se lo passi a una funzione che deve modificare anche il valore. Dovresti anche passare l'array come riferimento se è necessario rimuovere il valore da esso.
Consiglio di rendere la funzione di ritorno booleana sull'opportunità di rimuovere per impedire la creazione di più riferimenti. per es.
foreach ($array AS $key => &$value) {
//& reference only needed if execFunction must edit $value
if (execFunction(&$value)) {
unset($array[$key]);
} else {
$value['exec_failed']+=1;
}
}
unset($value);
anche il riferimento al valore $ persisterà oltre l'ambito del ciclo, quindi il trailing non impostato.
Un ultimo pensiero, sembrava che volessi fare il giro della matrice più volte. Assicurati di prestare attenzione a come il tuo ciclo si interrompe.
Grazie a tutti per il loro aiuto. La funzione unset () è, alla fine, ciò che mi è utile nelle esigenze specifiche di oggi. Ecco la breve storia del mio uso di unset ():
//array to be processed
$one=array('1','2','3');
//array of terms previously defined as a group to compare against
$against=array('1','2');
foreach($one as $key=>$value){
//pull out matching terms
$match=array_intersect($one,$against);
//my need is to sum grouped numbers
$sum=array_sum($match);
echo $sum."<br />";
//remove matching terms from original array
foreach($match as $key=>$value){
unset($one[$key]);
}
}
//now a parent looping function will process the remaining array elements. In this case, the only one left is '3'.