Некоторое время назад я использовал "традиционную" рекурсивную функцию для сглаживания многомерных массивов, таких как
$baseArray = array(array('alpha'),
array('beta','gamma'),
array(),
array(array('delta','epsilon'),
array('zeta',array('eta',
'theta'
),
),
),
array('iota'),
);
, в простой 1-й массив.
Прошлой ночью я подумал, что мне стоит взглянуть на использование array_walk_recursive () , чтобы посмотреть, смогу ли я сделать его более эффективным и чистым.
Моя первая попытка оказалась не очень успешной:
function flattenArray($arrayValue, $arrayKey, &$flatArray) {
$flatArray[] = $arrayValue;
}
$flattenedArray = array();
array_walk_recursive($baseArray,'flattenArray',$flattenedArray);
Я думал, что это должно работать, но все, что я получил, это ряд ошибок:
Warning: Cannot use a scalar value as an array in C:\xampp\htdocs\arrayTest.php on line 16
и результат:
array(0) { }
Тип подсказки вмоя функция flattenArray () дала мне
Catchable fatal error: Argument 3 passed to flattenArray() must be an array, integer given in C:\xampp\htdocs\arrayTest.php on line 16
Использование замыкания дало идентичные результаты
Единственный способ заставить его работать (без обращения к использованию global или static для моего flattenArray).) использовал обход по ссылке:
function flattenArray($arrayValue, $arrayKey, $flatArray) {
$flatArray[] = $arrayValue;
}
$flattenedArray = array();
array_walk_recursive($baseArray,'flattenArray',&$flattenedArray);
, который дает правильный результат
array(9) { [0]=> string(5) "alpha" [1]=> string(4) "beta" [2]=> string(5) "gamma" [3]=> string(5) "delta" [4]=> string(7) "epsilon" [5]=> string(4) "zeta" [6]=> string(3) "eta" [7]=> string(5) "theta" [8]=> string(4) "iota" }
, но дает мне неожиданное предупреждение
Deprecated: Call-time pass-by-reference has been deprecated in C:\xampp\htdocs\arrayTest.php on line 22
Я знаю, что PHP - причудливый язык, но это кажется немного экстремальным.Документация ясно показывает, что первым параметром для array_walk_recursive является передача по ссылке, но кажется, что дополнительные аргументы могут передаваться только по ссылке во время вызова.Странно!
Версия PHP - 5.3.8
Любые предложения о том, как я могу использовать array_walk_recursive для корректного выравнивания массива, без получения устаревших ошибок (кроме подачи отчета об ошибке).
РЕДАКТИРОВАТЬ
PS
Я знаю, что могу обойти эту проблему, используя замыкание:
$flattenedArray = array();
array_walk_recursive($baseArray, function($arrayValue, $arrayKey) use(&$flattenedArray){ $flattenedArray[] = $arrayValue; } );
var_dump($flattenedArray);
, но так как это требуетсядля библиотеки, которая в настоящее время позволяет использовать с PHP 5.2.0, нецелесообразно использовать функцию, которая требует значительно более поздней версии PHP