2010-08-24 29 views
11

In Python kann ich schreiben:PHP entspricht Python's enumerate()?

for i, val in enumerate(lst): 
    print i, val 

Der einzige Weg, ich weiß, wie dies in PHP zu tun ist:

for($i = 0; $i < count(lst); $i++){ 
    echo "$i $val\n"; 
} 

Gibt es einen sauberen Weg in PHP?

Antwort

22

nicht PHP Arrays vertrauen, sie sind wie Python dicts. Wenn Sie sicher Code wollen bedenken Sie:

<?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: das zweite Beispiel mit 'array_values' ist im Grunde, was 'enumerate' tut (natürlich' enumerate' akzeptiert auch Iteratoren, so dass Sie etwas mehr Code benötigen würden, um diesen Fall zu bearbeiten) ... – ircmaxell

+1

Zusätzlich zu @ ircmaxells Kommentar, PHP hat 'iterator_to_array ($ iterator, false)', das ein Array vom Iterator erzeugt. 'false' sagt ihm, dass er die Schlüssel des Iterators nicht verwenden soll, sondern einen inkrementierenden Wert wie' array_values' generiert. – Izkata

+1

Dokumentationslink für die faulen: ['array_values'] (http://php.net/manual/en/function.array-values.php). Es gibt auch ['array_keys'] (http://php.net/manual/en/function.array-keys.php), das dasselbe für die Schlüssel eines assoziierten Arrays tut. –

10

Verwendung foreach:

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

funktioniert nur, wenn das Array nicht assoziativ ist und/oder die Tasten sind kontinuierlich. –

+0

@Felix Kling: Huh? 'foreach' funktioniert für alle' Traversable' Objekte und Arrays. Worauf beziehen Sie sich? – ircmaxell

+2

@ircmaxell: Pythons 'enumerate()' zählt von einem Startwert (Standard '0') bis '# listElements'. Auf der anderen Seite geben Sie nur die Schlüssel des Arrays aus. Wenn das Array assoziativ ist, entspricht es nicht der 'enumerate()' -Funktion. Siehe Tomasz Antwort. –

1

Ja, Sie foreach Schleife von PHP verwenden:

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

Ich glaube, Sie wurden für die range Funktion suchen.

Ein Anwendungsfall könnte die Paginierung sein, bei der (vorausgesetzt, Sie haben 150 Artikel und Sie möchten 10 Artikel pro Seite anzeigen, so dass Sie 15 Links haben. Also diese Links zu erstellen, können Sie verwenden:

$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

Mit der Einführung von Verschlüssen in PHP 5.3 können Sie auch schreiben die folgenden:

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

Natürlich ist dies nur möglich, wenn die Anordnung in einem gespeichert Variable.

0

In Python Enumerate hat start Argument, um Startwert der Aufzählung zu definieren.

in PHP für diese Meine Lösung ist:

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)); 

Die Ausgabe lautet:

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

Wenn Sie den Index, Schlüssel und Wert, entspricht dieser Python:

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

Sie können in PHP eine Enumerationsfunktion erstellen, die Ihre Objekte umschließt. Es soll nicht effizient sein (es iteriert und sammelt alles), aber es kann syntaktisch bequem sein.

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; 
} 

Beispiel Nutzung:

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