В чем проблема с кодом ниже? Что это будет выводить? Как это можно исправить?
$referenceTable = array();
$referenceTable['val1'] = array(1, 2);
$referenceTable['val2'] = 3;
$referenceTable['val3'] = array(4, 5);
$testArray = array();
$testArray = array_merge($testArray, $referenceTable['val1']);
var_dump($testArray);
$testArray = array_merge($testArray, $referenceTable['val2']);
var_dump($testArray);
$testArray = array_merge($testArray, $referenceTable['val3']);
var_dump($testArray);
Спасибо
Вывод будет следующим:
array(2) { [0]=> int(1) [1]=> int(2) }
NULL
NULL
Вы также можете увидеть два сгенерированных предупреждения, похожие на следующее:
Warning: array_merge(): Argument #2 is not an array
Warning: array_merge(): Argument #1 is not an array
,
Проблема здесь в том, что если первый или второй аргумент array_merge()
это не array
, возвращаемое значение будет NULL. Например, хотя можно разумно ожидать, что такой вызов, как array_merge($someValidArray, NULL)
просто вернется $someValidArray
вместо этого возвращается NULL
! (И что еще хуже, это совсем не документировано в документации PHP.)
В результате звонок в
$testArray = array_merge($testArray, $referenceTable['val2'])
оценивает $testArray = array_merge($testArray, 3)
и, поскольку 3 не относится к типу array, этот вызов array_merge () возвращает NULL, что, в свою очередь, приводит к установке $testArray
равно NULL. Затем, когда мы перейдем к следующему вызову array_merge (), $testArray
теперь NULL, поэтому array_merge () снова возвращает NULL. (Это также объясняет, почему первое предупреждение жалуется на аргумент № 2, а второе предупреждение жалуется на аргумент № 1.)
Исправить это просто. Если мы просто введем второй аргумент в массив, мы получим желаемые результаты.
Других решений пока нет …