Может ли PHP list() работать с ассоциативными массивами?

Пример:

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

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

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

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

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


person rsk82    schedule 04.12.2011    source источник


Ответы (6)


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

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

extract(array('fruit1' => 'apples', 'fruit2' => 'oranges'));
var_dump($fruit1);
var_dump($fruit2);
person landons    schedule 04.12.2011
comment
Да, это работает. С другой стороны, почти всегда рекомендуется указывать префикс при использовании extract, если только вы не уверены на 100%, какие ключи будут присутствовать. - person lonesomeday; 05.12.2011
comment
Да, я бы сначала запустил его с array_intersect_key() с ожидаемыми ключами. - person landons; 05.12.2011
comment
Но это не сработает, если у вас есть массив, подобный полученному из getimagesize(). - person Jurik; 07.05.2014
comment
@Юрик, правда. Использование list() было бы способом продолжить getimagesize() - person landons; 08.05.2014
comment
Нет, list() тоже не сработает. Потому что последние два элемента этого массива имеют нечисловые ключи. Я не понимаю, почему они сделали такую ​​ерунду с getimagesize(). - person Jurik; 08.05.2014
comment
@Юрик, ты пробовал использовать list() с array_values()? Вы правы, эта функция странная. - person landons; 13.05.2014
comment
Да, это и мое решение. - person Jurik; 14.05.2014
comment
Пожалуйста, не используйте extract. IDE не могут справиться с этим. И это может создать множество других проблем. - person peter; 08.10.2015
comment
мое предложение состоит в том, чтобы установить переменные в комментарии, чтобы IDE могли их прочитать, например extract(array('fruit1'=>'apples','fruit2'=>'oranges')); /** * @var Array $fruit1 * @var Array $fruit2 */ - person Full; 09.05.2016
comment
Очень нечитаемое и плохое решение! list() так же читаем, как и extract. - person Saeed Falsafin; 01.01.2018
comment
см. ответ @ K-Gun для решения PHP 7.1. как упомянул Питер, Extract() — это старая функция, которая имеет множество проблем, как тонких, так и катастрофических. на странице документа PHP в Extract() содержится несколько различных предупреждений о его использовании: php .net/manual/en/function.extract.php - person Ben; 22.10.2018
comment
Я согласен с Питером, единственный способ для моей IDE узнать, что переменные существуют (и не помечать их красным), - это объявить /** @var $variableName **/ перед экстрактом - person user1015214; 29.10.2018
comment
PHP 7.1 предлагает более чистый способ - вместо этого см. ответ K-Gun. - person Bananaapple; 05.12.2018
comment
@Bananaapple, я соответствующим образом отредактировал свой ответ. Я могу быть предвзятым, но я не уверен, что отрицание ответов, которые были правдой в то время, обязательно является правильным подходом. Спасибо, что обратили на это мое внимание. - person landons; 03.01.2019
comment
Я определенно вижу, что вы исходите из @landons, но, с другой стороны, это произвело желаемый эффект — возможно, что-то, что нужно узнать о мете. В любом случае спасибо за редактирование! - person Bananaapple; 03.01.2019
comment
хм... что, если ваш массив похож на array('[email protected]'=>'Omer Aslam','[email protected]'=>'Landons'), как вы собираетесь получить к ним доступ? - person Muhammad Omer Aslam; 04.01.2021

С/из 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
person K-Gun    schedule 21.12.2016

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

<?php
   list($fruit1, $fruit2) = array_values( array('fruit1'=>'apples','fruit2'=>'oranges') );
?>
person Broom    schedule 15.01.2014
comment
Этот метод лучше (тогда принимается ответ), если вы хотите пропустить некоторые клавиши - person machineaddict; 25.08.2014
comment
Это не работает, если значения в массиве расположены в обратном порядке, например array('fruit2'=>'apples','fruit1'=>'oranges'). Значение «fruit2» присваивается $fruit1 и наоборот. - person jonasfh; 30.03.2016
comment
PHP 7.1 предлагает более чистый способ - вместо этого см. ответ K-Gun. - person Bananaapple; 05.12.2018

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

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
person Alexander Malakhov    schedule 29.10.2015

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

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

person Trung Phạm    schedule 03.11.2016

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

<?php

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

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

?>
person krommer_b    schedule 15.08.2013
comment
Извините, но на самом деле переменные переменные почти никогда не являются элегантным решением. - person Kzqai; 03.06.2014
comment
Так почему бы не использовать extract()? Это в основном делает то, что вы предлагаете решение - person Ali Alwash; 05.04.2015