На Python я могу написать:

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

Единственный способ, которым я знаю, как сделать это в PHP:

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

Есть ли более чистый путь в PHP?

14
davidscolgan 25 Авг 2010 в 00:29

7 ответов

Лучший ответ

Не доверяйте PHP-массивам, они как Python dicts. Если вы хотите безопасный код, учтите это:

<?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 
26
JeromeJ 6 Фев 2014 в 21:46

Если вы хотите индекс, ключ и значение, эквивалентные этому Python:

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

Вы можете создать функцию перечисления в PHP, которая обернет ваши объекты. Он не предназначен для того, чтобы быть эффективным (он предварительно повторяет и собирает все), но может быть синтаксически удобным.

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

Пример использования:

foreach (enumerate($my_array) as $iter) {
    echo $iter->index;
    echo $iter->key;
    echo $iter->value;
}
0
zekel 4 Мар 2016 в 19:05

В python enumerate имеет аргумент start, чтобы определить начальное значение перечисления.

Мое решение для этого в php:

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

Результат:

array(3) {
  [6000]=>
  string(1) "a"
  [6001]=>
  string(1) "b"
  [6002]=>
  string(1) "c"
}
0
Wallace Maxters 19 Янв 2016 в 00:23

С введением замыканий в PHP 5.3 вы также можете написать следующее:

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

Конечно, это работает, только если массив хранится в переменной.

0
nemo 4 Дек 2015 в 19:20

Я думаю, что вы искали функцию диапазона.

Одним из вариантов использования может быть разбиение на страницы, где (предположим) у вас есть 150 элементов, и вы хотите показать 10 элементов на странице, чтобы у вас было 15 ссылок. Поэтому для создания этих ссылок вы можете использовать:

    $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
edam 20 Май 2015 в 10:05

Да, вы можете использовать цикл foreach PHP:

 foreach($lst as $i => $val)
       echo $i.$val;
1
shamittomar 24 Авг 2010 в 20:34

Используйте foreach:

foreach ($lst as $i => $val) {
    echo $i, $val;
}
11
Crozin 24 Авг 2010 в 20:32