2010-08-24 8 views

Répondre

22

Ne faites pas confiance des tableaux PHP, ils sont comme dicts Python. Si vous voulez un code sûr considérez ceci:

<?php 
$lst = array('a', 'b', 'c'); 

// Removed a value to prove that keys are preserved 
unset($lst[1]); 

// So this wont work 
foreach ($lst as $i => $val) { 
     echo "$i $val \n"; 
} 

echo "\n"; 

// Use array_values to reset the keys instead 
foreach (array_values($lst) as $i => $val) { 
     echo "$i $val \n"; 
} 
?> 

-

0 a 
2 c 

0 a 
1 c 
+2

+1: le deuxième exemple utilisant 'array_values' est essentiellement ce que fait enumerate' (bien sûr' enumerate' accepte aussi les itérateurs, donc vous aurez besoin d'un peu plus de code pour gérer ce cas) ... – ircmaxell

+1

En plus de @ Le commentaire d'ircmaxell, PHP a 'iterator_to_array ($ iterator, false)' qui va créer un tableau depuis l'itérateur. 'false' lui dit de ne pas utiliser les clés de l'itérateur, mais d'utiliser une valeur incrémentée comme' array_values'. – Izkata

+1

Lien de documentation pour les fainéants: ['array_values'] (http://php.net/manual/fr/function.array-values.php). Il y a aussi ['array_keys'] (http://php.net/manual/fr/function.array-keys.php) qui fait la même chose pour les clés d'un tableau associatif. –

10

Utilisation foreach:

foreach ($lst as $i => $val) { 
    echo $i, $val; 
} 
+1

ne fonctionne que si le tableau n'est pas associative et/ou les touches sont continues. –

+0

@Felix Kling: Hein? 'foreach' fonctionne pour tous les objets et tableaux' Traversable'. A quoi faites-vous référence? – ircmaxell

+2

@ircmaxell: 'enumerate()' de Python compte à partir d'une valeur de départ (par défaut '0') à' # listElements'. Vous d'autre part ne font que sortir les clés du tableau. Si le tableau est associatif, alors il n'est pas équivalent à la fonction 'enumerate()'. Voir Tomasz réponse. –

1

Oui, vous pouvez utiliser la boucle foreach de PHP:

foreach($lst as $i => $val) 
     echo $i.$val; 
0

Je pense que vous recherchez la fonction range.

Un cas d'utilisation pourrait être la pagination où (supposons) que vous avez 150 éléments et que vous voulez afficher 10 éléments par page pour avoir 15 liens. Donc, pour créer ces liens, vous pouvez utiliser:

$curpage=3;$links=15;$perpage=10; //assuming. 

    <?php foreach(range(1,$links) as $i):?> 
     <?php if($i==$curpage):?> 
      <li class="active"><a class="active"><?=$i?></a><li> 
     <?php else:?> 
      <li><a href="paging_url"><?=$i?></a><li> 
     <?php endif ?> 
    <?php endforeach ?> 
0

Avec l'introduction de fermetures en PHP 5.3, vous pouvez également écrire:

array_map(function($i,$e) { /* */ }, range(0, count($lst)-1), $lst); 

Bien sûr, cela ne fonctionne que si le tableau est stocké dans un variable.

0

Enumère python a start argument, pour définir la valeur de début de l'énumération.

Ma solution pour cela en php est:

function enumerate(array $array, $start = 0) 
{ 
    $end = count($array) -1 + $start; 

    return array_combine(range($start, $end), $array); 
} 

var_dump(enumerate(['a', 'b', 'c'], 6000)); 

La sortie est:

array(3) { 
    [6000]=> 
    string(1) "a" 
    [6001]=> 
    string(1) "b" 
    [6002]=> 
    string(1) "c" 
} 
0

Si vous voulez que l'index, la clé et la valeur, ce qui équivaut à ce Python:

for ii, (key, value) in enumerate(my_dict.items()): 
    print ii 
    print key 
    print value 

Vous pouvez créer une fonction d'énumération en PHP qui enveloppe vos objets. Ce n'est pas destiné à être efficace (il pré-itère et rassemble tout) mais il peut être syntaxiquement pratique.

function enumerate($array) { 
    class IterObject { 
     public $index; 
     public $key; 
     public $value; 
    } 

    $collect = array(); 
    $ii = 0; 
    foreach ($array as $key => $value) { 
     $iter = new IterObject(); 
     $iter->index = $ii; 
     $iter->key = $key; 
     $iter->value = $value; 
     array_push($collect, $iter); 
     $ii++; 
    } 
    return $collect; 
} 

Exemple d'utilisation:

foreach (enumerate($my_array) as $iter) { 
    echo $iter->index; 
    echo $iter->key; 
    echo $iter->value; 
}