В Python я могу написать:
for i, val in enumerate(lst):
print i, val
Единственный способ, которым я знаю, как это сделать в PHP:
for($i = 0; $i < count(lst); $i++){
echo "$i $val\n";
}
Есть ли более чистый способ в PHP?
В Python я могу написать:
for i, val in enumerate(lst):
print i, val
Единственный способ, которым я знаю, как это сделать в PHP:
for($i = 0; $i < count(lst); $i++){
echo "$i $val\n";
}
Есть ли более чистый способ в PHP?
Не доверяйте массивам 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
Используйте foreach
:
foreach ($lst as $i => $val) {
echo $i, $val;
}
Да, вы можете использовать цикл foreach
PHP:
foreach($lst as $i => $val)
echo $i.$val;
Я думаю, вы искали функцию range.
Одним из вариантов использования может быть разбиение на страницы, где (предположительно) у вас есть 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 ?>
С введением замыканий в PHP 5.3 вы также можете написать следующее:
array_map(function($i,$e) { /* */ }, range(0, count($lst)-1), $lst);
Конечно, это работает только в том случае, если массив хранится в переменной.
В 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"
}
Если вам нужен индекс, ключ и значение, эквивалентное этому 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;
}