Pytanie Czy jakaś lista () w najnowszym nadchodzącym PHP działa z tablicami asocjacyjnymi?


Przykład:

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

powyższy kod oczywiście działa poprawnie, ale kod poniżej:

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

daje: Notice: Undefined offset: 1 in....

Czy istnieje sposób na odwoływanie się do nazwanych kluczy w jakiś sposób z listą jak list('fruit1' : $fruit1)Czy widziałeś coś podobnego do tego planowanego na przyszłe wydanie?


26
2017-12-04 22:16


pochodzenie




Odpowiedzi:


Spróbuj extract() funkcjonować. Tworzy zmienne wszystkich kluczy przypisanych do powiązanych wartości:

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

38
2017-12-04 22:18



Tak, to działa. Z drugiej strony, prawie zawsze dobrą praktyką jest podawanie prefiksu podczas używania extract chyba że jesteś w 100% absolutnie pewien, które klucze będą obecne. - lonesomeday
Tak, uruchomię go najpierw z array_intersect_key () z oczekiwanymi kluczami. - landons
Ale to nie zadziała, jeśli masz tablicę podobną do tej, z której korzystasz getimagesize(). - Jurik
@Jurik, czy próbowałeś używać list() z array_values()? Masz jednak rację - ta funkcja jest dziwna. - landons
Proszę nie używać extract. IDE nie mogą sobie z tym poradzić. I może stworzyć wiele innych problemów. - peter


A co z wykorzystaniem array_values ​​()?

<?php
   list($fruit1, $fruit2) = array_values( array('fruit1'=>'apples','fruit2'=>'oranges') );
?>

38
2018-01-15 11:18



Ta metoda jest lepsza (wtedy akceptowana odpowiedź), jeśli chcesz pominąć niektóre klawisze - machineaddict
To nie działa, jeśli wartości w tablicy są w odwrotnej kolejności, jak array('fruit2'=>'apples','fruit1'=>'oranges'). Wartość "owoc2" jest przypisana $ owoc1 i odwrotnie. - jonasfh


Z 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

18
2017-12-21 00:30



To powinna być zaakceptowana odpowiedź! - Aaron Hill


Jest to dość proste do wdrożenia.

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;

wydajność: 1, , 3

  • mniej pisania po stronie użycia
  • brak zależności kolejności elementów (w przeciwieństwie do array_values)
  • bezpośrednia kontrola nad nazwami zmiennych (w przeciwieństwie do extract) - mniejsze ryzyko kolizji nazw, lepsza obsługa IDE

1
2017-10-29 09:45





Jeśli jesteś w moim przypadku:

list () działa tylko w tablicy numerycznej. Więc jeśli możesz, pozostawiając puste w fetch () lub fetchAll () -> niech ma 2 opcje: tablicę numeryczną i tablicę asocjacyjną. To będzie działać.


1
2017-11-03 11:36





uważają to za eleganckie rozwiązanie:

<?php

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

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

?>

-2
2017-08-15 21:21



Przepraszam, ale w rzeczywistości zmienne zmienne prawie nigdy nie są "eleganckim" rozwiązaniem. - Kzqai
Dlaczego więc nie używać funkcji extract ()? Zasadniczo robi to, co oferuje rozwiązanie - Ali Alwash


<?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


?>

-4
2017-12-04 22:29



Zasadniczo to jest extract robi. - Rocket Hazmat