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

Пример:

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)


РЕДАКТИРАНЕ: Този подход беше полезен навремето (беше попитан и отговорен преди девет години), но вижте отговор по-долу за по-добър подход с по-нов синтаксис на 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
@Jurik, пробвал ли си да използваш 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 doc за extract() идва с няколко различни предупреждения относно използването му: php .net/manual/en/function.extract.php - person Ben; 22.10.2018
comment
Съгласен съм с Peter, единственият начин моята 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