Come trovare l'indice foreach?


490

È possibile trovare l' foreachindice?

in un forciclo come segue:

for ($i = 0; $i < 10; ++$i) {
   echo $i . ' ';
}

$i ti darà l'indice.

Devo usare il forloop o c'è un modo per ottenere l'indice nel foreachloop?

Risposte:


909
foreach($array as $key=>$value) {
    // do stuff
}

$keyè l'indice di ciascun $arrayelemento


2
Dipende dal significato dell'OP per indice: <? $ a = array (3,5, 'xx', 4312, 'sasas'); unset ($ a [3]); foreach ($ a as $ k => $ v) stampa "\ $ k = $ k e \ $ v = $ v"; ?>
Milen A. Radev il

9
sicuramente, questa domanda non è molto specifica, ho pensato che l'OP fosse in gran parte inconsapevole della sintassi $ key => $ value
Owen

38
bene, in realtà è giusto, ma non dovrebbe essere la risposta accettata, poiché anche la chiave può essere una stringa. supponiamo che $myarr['foo'] = 'bar';questo metodo fallisca
Toskan,

12
@Bison hai ragione nel senso che non fallisce. Ma non soddisfa la domanda del PO. Sta cercando valori numerici come l'ennesimo elemento.
Toskan,

3
Come dice @Toskan, questa non dovrebbe essere la risposta accettata. Penso che sia meglio creare una variabile al di fuori del ciclo e contare da lì, aumentandola con vatiable++;ogni iterazione. Il modo tradizionale, ma ha sempre funzionato.
Jomar Sevillejo,

172

Puoi inserire un hack nel tuo foreach, come ad esempio un campo incrementato su ogni run-through, che è esattamente quello forche ti dà il loop in un array indicizzato numericamente. Un tale campo sarebbe uno pseudo-indice che necessita di una gestione manuale (incrementi, ecc.).

A foreachti darà il tuo indice nella forma del tuo $keyvalore, quindi un tale hack non dovrebbe essere necessario.

ad es. in a foreach

$index = 0;
foreach($data as $key=>$val) {
    // Use $key as an index, or...

    // ... manage the index this way..
    echo "Index is $index\n";
    $index++;
}

128
Avere un valore incrementato in un ciclo non è certo un "hack".
Thomas McCabe,

17
@ThomasMcCabe Si potrebbe anche dire che è uno degli usi principali di un loop.
Byson,

26

Va notato che è possibile chiamare key()qualsiasi array per trovare il tasto corrente acceso. Come puoi immaginare current(), restituirà il valore corrente e next()sposta il puntatore dell'array sull'elemento successivo.


Ciò dovrebbe essere utile se si desidera utilizzare un semplice array associativo PHP per archiviare i dati che devono essere esposti tramite l'interfaccia Iterable (dove è necessario tenere traccia di dove ci si trova in un ciclo).
Peter,

2
+1 per l'alternativa, ma una chiamata di funzione in ogni iterazione è un po 'più pesante rispetto all'utilizzo di variabili preassegnate (cioè utilizzando il $keyda $key=>$value) ... Tuttavia, scommetto che le prestazioni inferiori non sono significative / percepibili in un semplice ciclo.
Armfoot,

20

Owen ha una buona risposta. Se vuoi solo la chiave e stai lavorando con un array, questo potrebbe anche essere utile.

foreach(array_keys($array) as $key) {
//  do stuff
}

4
E se avete bisogno l'indice, foreach(array_keys($array) as $index=>$key).
Leo,

14

È possibile creare $ial di fuori del ciclo e fare $i++nella parte inferiore del ciclo.


16
È importante notare che questo approccio fornisce l'iterazione corrente del ciclo, NON l'indice corrente dell'array iterato.
Peter Bailey,

8

Questi due anelli sono equivalenti (esclude ovviamente le ringhiere di sicurezza):

for ($i=0; $i<count($things); $i++) { ... }

foreach ($things as $i=>$thing) { ... }

per esempio

for ($i=0; $i<count($things); $i++) {
    echo "Thing ".$i." is ".$things[$i];
}

foreach ($things as $i=>$thing) {
    echo "Thing ".$i." is ".$thing;
}

17
Non se si tratta di un array associativo
JoeCortopassi

8

Penso che l'opzione migliore sia la stessa:

foreach ($lists as $key=>$value) {
    echo $key+1;
}

è facile e normalmente


Funziona come un fascino
Steve Nosse

5

Jonathan ha ragione. Le matrici PHP fungono da tabella di mappatura associando le chiavi ai valori. in alcuni casi è possibile ottenere un indice se l'array è definito, ad esempio

$var = array(2,5);

for ($i = 0; $i < count($var); $i++) {
    echo $var[$i]."\n";
}

il tuo output sarà

2
5

nel qual caso ogni elemento dell'array ha un indice conoscibile, ma se poi fai qualcosa come il seguente

$var = array_push($var,10);

for ($i = 0; $i < count($var); $i++) {
    echo $var[$i]."\n";
}

non si ottiene alcun output. Ciò accade perché le matrici in PHP non sono strutture lineari come nella maggior parte delle lingue. Sono più simili alle tabelle hash che possono avere o meno chiavi per tutti i valori memorizzati. Quindi foreach non usa gli indici per strisciare su di essi perché hanno un indice solo se l'array è definito. Se è necessario disporre di un indice, assicurarsi che gli array siano completamente definiti prima di eseguire la scansione su di essi e utilizzare un ciclo for.


Sì, questo è il motivo per cui in PHP dobbiamo "unire le matrici" per chiavi e non per indici ... Vedi anche array_map (func, $ a, $ b).
Peter Krauss,

Ops, caro lettore e @TheBrawnyMan, ricorda anche che il tuo esempio è come un bug array_push () (!). La raccomandazione è di usare $var[] = 10;(consultare il link PHP per guidare), quindi il secondo forloop fornisce i risultati previsti.
Peter Krauss,

4

Gli array PHP hanno puntatori interni, quindi prova questo:

foreach($array as $key => $value){
   $index = current($array);
}

Funziona bene per me (testato solo in via preliminare).


1

Normalmente lo faccio quando lavoro con array associativi:

foreach ($assoc_array as $key => $value) {
 //do something
}

Funzionerà bene anche con array non associativi. La chiave $ sarà il valore dell'indice. Se preferisci, puoi fare anche questo:

foreach ($array as $indx => $value) {
  //do something
}

4
A cosa serve l'alternativa? Sai che è lo stesso, oltre ai nomi delle variabili? Quindi l'ultima frase e il blocco di codice non sono necessari, direi - se fa qualcosa confonde solo ..
Dennis98

@ Dennis98 La differenza è che uno di essi ha un array associativo come input e l'altro ha un array numerico. Anche se immagino che sarebbe meglio se la risposta fosse un po 'più dettagliata.
I_ATE_YOUR_WORK_FILES

0

Vorrei aggiungere questo, l'ho usato in laravel solo per indicizzare la mia tabella:

  • Con $ loop-> indice
  • Ho anche preincrementato con ++ $ loop per iniziare da 1

Il mio codice:

@foreach($resultsPerCountry->first()->studies as $result)
  <tr>
    <td>{{ ++$loop->index}}</td>                                    
  </tr>
@endforeach

Questa domanda non è stata posta per laravel. La $loopvariabile non può essere utilizzata perché è richiesta PHP generale.
Özgür Can Karagöz,

0

Ho risolto in questo modo, quando ho dovuto utilizzare l'indice foreach e il valore nello stesso contesto:

$array = array('a', 'b', 'c');
foreach ($array as $letter=>$index) {

  echo $letter; //Here $letter content is the actual index
  echo $array[$letter]; // echoes the array value

}//foreach

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.