Может ли список() в последней предстоящей работе PHP с ассоциативными массивами каким-то образом?
Пример:
list($fruit1, $fruit2) = array('apples', 'oranges');
код выше, конечно, работает нормально, но код ниже:
list($fruit1, $fruit2) = array('fruit1' => 'apples', 'fruit2' => 'oranges');
дает: Notice: Undefined offset: 1 in....
Можно ли каким-либо образом ссылаться на именованные ключи с таким списком, как list('fruit1' : $fruit1)
, видели ли вы что-то подобное в будущей версии?
Ответы
Ответ 1
ОБНОВЛЕНИЕ: Этот подход был полезен в те времена (его буквально спрашивали об ответе более семи лет назад), но см. ответ K-Gun ниже для лучшего подхода с более новым синтаксисом PHP 7+.
Попробуйте функцию extract()
. Он создаст переменные всех ваших ключей, присвоенных их связанным значениям:
extract(array('fruit1' => 'apples', 'fruit2' => 'oranges'));
var_dump($fruit1);
var_dump($fruit2);
Ответ 2
С/из 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
Ответ 3
Как насчет использования array_values ()?
<?php
list($fruit1, $fruit2) = array_values( array('fruit1'=>'apples','fruit2'=>'oranges') );
?>
Ответ 4
Это довольно просто реализовать.
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
Ответ 5
Если вы в моем случае:
list() работает только с числовым массивом. Поэтому, если вы можете, оставив пустым в fetch() или fetchAll() → пусть у него есть 2 варианта: численный массив и ассоциативный массив. Он будет работать.
Ответ 6
считают это элегантным решением:
<?php
$fruits = array('fruit1'=> 'apples','fruit2'=>'oranges');
foreach ($fruits as $key => $value)
{
$$key = $value;
}
echo $fruit1; //=apples
?>
Ответ 7
<?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
?>