Может ли list () в последующем PHP работать с ассоциативными массивами? - PullRequest
36 голосов
/ 05 декабря 2011

Пример:

list($fruit1, $fruit2) = array('apples', 'oranges');

код выше, конечно, работает нормально, но код ниже:

list($fruit1, $fruit2) = array('fruit1' => 'apples', 'fruit2' => 'oranges');

дает: Notice: Undefined offset: 1 in....

Есть ли способкак-то ссылаться на именованные ключи со списком вроде list('fruit1' : $fruit1), вы видели что-нибудь подобное, запланированное на будущий выпуск?

Ответы [ 7 ]

46 голосов
/ 21 декабря 2016

С PHP 7.1 ;

$array = ['fruit1' => 'apple', 'fruit2' => 'orange'];

// [] style
['fruit1' => $fruit1, 'fruit2' => $fruit2] = $array;

// list() style
list('fruit1' => $fruit1, 'fruit2' => $fruit2) = $array;

print $fruit1; // apple
43 голосов
/ 15 января 2014

А как насчет использования array_values ​​()?

<?php
   list($fruit1, $fruit2) = array_values( array('fruit1'=>'apples','fruit2'=>'oranges') );
?>
41 голосов
/ 05 декабря 2011

РЕДАКТИРОВАТЬ: Этот подход был полезен в те времена (буквально его спросили более семи лет назад), но посмотрите ответ K-Gun ниже для лучшего подхода с более новым синтаксисом PHP 7+.

Попробуйте функцию extract(). Это создаст переменные всех ваших ключей, присвоенных их связанным значениям:

extract(array('fruit1' => 'apples', 'fruit2' => 'oranges'));
var_dump($fruit1);
var_dump($fruit2);
1 голос
/ 03 ноября 2016

Если вы в моем случае:

list () работает только с числовым массивом. Так что, если можете, оставьте пустым в fetch () или fetchAll () -> пусть у него есть 2 варианта: числовой массив и ассоциативный массив. Это будет работать.

1 голос
/ 29 октября 2015

Это довольно просто реализовать.

function orderedValuesArray(array &$associativeArray, array $keys, $missingKeyDefault = null)
{
    $result = [];
    foreach ($keys as &$key) {
        if (!array_key_exists($key, $associativeArray)) {
            $result[] = $missingKeyDefault;
        } else {
            $result[] = $associativeArray[$key];
        }
    }
    return $result;
}
$arr = [
    'a' => 1,
    'b' => 2,
    'c' => 3
];
list($a, $b, $c) = orderedValuesArray($arr, ['a','AAA', 'c', 'b']);
echo $a, ', ', $b, ', ', $c, PHP_EOL;

вывод: 1, , 3

  • меньше печатать на стороне использования
  • нет зависимости порядка элементов (в отличие от array_values)
  • прямой контроль над именами переменных (в отличие от extract) - меньший риск конфликта имен, улучшенная поддержка IDE
0 голосов
/ 16 августа 2013

считают это элегантным решением:

<?php

    $fruits = array('fruit1'=> 'apples','fruit2'=>'oranges');  

    foreach ($fruits as $key => $value)  
    {
        $$key = $value;  
    }
    echo $fruit1; //=apples  

?>
0 голосов
/ 05 декабря 2011
<?php

function array_list($array)
{
    foreach($array as $key => $value)
    $GLOBALS[$key] = $value;
}

$array = array('fruit2'=>'apples','fruit1'=>'oranges');

array_list($array);

echo $fruit1; // oranges


?>
...