2015-11-03 5 views
2

Я пытаюсь извлечь смешанный ассоциативный массив как:PHP - Извлечение ассоциативный массив

<pre> 
     <?php 


     bar(); 

     function bar(){ 
      $apple = 6; 
      $ball = 2; 
      $cat = 3; 

      $data = ["apple" => 1, $ball,$cat]; 

      foo($data); 
     } 

     function foo($data){ 
      extract($data); 
      echo "<br />apple:" . $apple; 
      echo "<br />ball:" . $ball; 
      echo "<br />cat:" . $cat; 
     } 

     ?> 
</pre> 

The $data массив может быть только числовым, только ассоциативно или обоих. Если элемент массива пропускает индекс, он должен быть таким же, как и переменная.

+0

@Andrew, No. Array иногда может ассоциироваться только с числом или числом. Они смешаны с любым уровнем. – tika

+0

'$ ball' и' $ cat' определены в области (до извлечения), и поэтому они все еще существуют. Вот почему они не работают в функции. У массива нет индекса для назначения переменной при запуске extract. , – Twisty

+0

RTFM -> extract создает переменные, используя ключи как имена переменных, а значения как ... erm ... значения. В вашем первом фрагменте просто так бывает, что '$ cat' и' $ ball' имеют то же значение, что и ключи '0' и' 1' в массиве, но 'extract' фактически пропускает числовые индексы –

ответ

5

Это не работает в вашей функции, потому что $ ball и $ cat не определены в области функций. Функция extract() будет присваивать значение переменной только в том случае, если значение в массиве имеет ключ, который делает $ apple. Это означает, что $ apple будет выводиться в функции, но $ ball и $ cat не будут определены.

Это происходит потому, что для того, чтобы extract() знал, как назвать переменную, должен быть ключ в массиве.

Чтобы сделать это, вам необходимо либо вручную указать ключи в массиве каждый раз:

$apple = 6; 
$ball = 2; 
$cat = 3; 
$data = ["apple" => $apple, "ball" => $ball, "cat" => $cat]; 

// Now, extracting from $data creates the variables we need... 
// Unsetting the $apple, $ball, and $cat variables 
// allows us to see that extract is recreating them. 
unset($apple, $ball, $cat); 
extract($data); 
echo $apple, $ball, $cat; 

Или вам нужно проверить $ шариковых и $ кошачьи переменные, чтобы увидеть, если они являются массивами. Если они являются массивами, вы можете использовать их ключ в массиве, чтобы extract() знал, как назвать создаваемую им переменную. Вам нужно динамически определить, имеет ли переменная уже ключ (это массив), или этого достаточно?

EDIT: Это не должно происходить с помощью extract(). Реально, вы должны создать класс и сохранить эти данные в классе. Тогда загрузка класса даст вам эту информацию. extract() - опасный и беспорядочный зверь.

+0

Хорошая точка для отмены переменных, чтобы понять, что происходит ...! Без ключей «ball» и «cat» в $ data этот код не сработает! – Random

+0

@Random: если вы не префикс значений, которые вы используете 'extract'-ing –

+0

@MikelBitson, данные будут смешанным массивом и будут. – tika

0

Альтернативный ответ. Точка остается прежней, если у вас есть массив смешанного контента, не используйте extract().

function foo($data){ 
    extract($data); 
    echo "<br />apple:" . (isset($apple)?$apple:$data[0]); 
    echo "<br />ball:" . (isset($ball)?$ball:$data[1]); 
    echo "<br />cat:" . (isset($cat)?$cat:$data[2]); 
} 

Здесь вы можете увидеть подводные камни. Если данные имеют более или менее индексы, или порядок неправильный, вы получите неудачный индекс или неправильное значение.

+0

Проблема в том, что я понятия не имею, что грядущее, яблоко, шар, самолет. . :( – tika

+0

Как форматировать данные? Как данные представлены вам? – Twisty

Смежные вопросы