Это не работает в вашей функции, потому что $ 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() - опасный и беспорядочный зверь.
@Andrew, No. Array иногда может ассоциироваться только с числом или числом. Они смешаны с любым уровнем. – tika
'$ ball' и' $ cat' определены в области (до извлечения), и поэтому они все еще существуют. Вот почему они не работают в функции. У массива нет индекса для назначения переменной при запуске extract. , – Twisty
RTFM -> extract создает переменные, используя ключи как имена переменных, а значения как ... erm ... значения. В вашем первом фрагменте просто так бывает, что '$ cat' и' $ ball' имеют то же значение, что и ключи '0' и' 1' в массиве, но 'extract' фактически пропускает числовые индексы –