Sostituzione dell'array nel ciclo foreach con l'array modificato nello stesso loop

StackOverflow https://stackoverflow.com/questions/229491

  •  04-07-2019
  •  | 
  •  

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?

È stato utile?

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'.
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top