Можно ли встроить функцию списка в оператор foreach в PHP? - PullRequest
3 голосов
/ 14 марта 2012

Я думал об этой проблеме раньше, но никогда не занимался этим.Я думаю, что я сделал это с Python, но никогда не PHP.

Определите базовый массив PHP:

$arr = array (array(1,2,3), array(4,5,6), array(7,8,9));

Затем запустите этот фрагмент:

foreach ($arr as $row)
{
    list($a, $b, $c) = $row;
    echo "$a, $b, $c <br>";
}

Этотак часто, я должен был сделать это миллион раз за свою карьеру php ... но это кажется немного расточительным.$ row - это временная переменная, которая в действительности никогда не используется, и list () = строка выглядит так, как будто ее можно поместить в скобку foreach

Примерно так (конечно, это не работает):

foreach ($arr as list($a, $b, $c) = $row)
{
    echo "$a, $b, $c <br>";
}

Ни один не делает:

foreach ($arr as list($a, $b, $c))
{
    echo "$a, $b, $c <br>";
}

Кто-нибудь придумал крутой ярлык для этого?Спасибо!

Ответы [ 3 ]

3 голосов
/ 14 марта 2012

Да, вроде.Используйте это:

while( list( $key, list( $a, $b, $c ) ) = each( $array ) ) {
    // do stuff here
}

Обратите внимание на использование list дважды - each возвращает пару ключ-значение, и значение также является массивом, поэтому мы снова используем list.

Вы также можете использовать list( , list( $a, $b, $c ) ), опуская $key, если хотите.Но я думаю, что это некрасивый синтаксис.;)

1 голос
/ 14 марта 2012

Хотя это не будет включать список в foreach, другой подход, который вы можете найти, - это использовать вместо foreach и таким образом обходить временную переменную следующим образом:

$a = array (array(1,2,3), array(4,5,6), array(7,8,9));
$count=(int)count($a);
for ($i=(int)0; $i<count; $i++) {
    list($a, $b, $c)=$a[$i];
    echo "$a, $b, $c<br />";
}

С этим ядобавлено еще 2 переменные, но они содержат только целое число, что определенно уменьшает использование памяти, удаляя временную переменную, которая будет содержать массив.

1 голос
/ 14 марта 2012

Вы можете попробовать это:

$array = array( array(1, 2, 3), array(4, 5, 6), array(7, 8, 9) );
for($next = current($array), list($a, $b, $c) = $next;
    // ^ current array           ^ current list
    $next;
    // ^ check if array
    $next = next($array), list($a, $b, $c) = $next)
    // ^ next array         ^ next array's list
{
    echo "$a, $b, $c <br>".PHP_EOL;
}

Демо: http://codepad.org/cuYl6iaa

Выход:

1, 2, 3 <br>
4, 5, 6 <br>
7, 8, 9 <br>
...