массивы — PHP array_merge_recursive функция с пустыми значениями

У меня есть два массива ниже и я использовал функцию array_merge_recursive, так как у меня многомерные массивы, но когда один из ключей из первого массива имеет пустое значение, а тот же ключ имеет массив в другом массиве, то после функции array_merge_recursive добавляется ключ «0» к этот ключ.

например

$a = array("id"=>"0", "test-for-draft_FirstName"=>"testtt","test-for-draft_subform1"=>"");
$b = array("test-for-draft_subform1"=>array("test-for-draft_subform10"=>array("subform-1_FileField_60"=>array("name"=>"abcd")),"test-for-draft_subform11"=>array("subform-1_FileField_60"=>array("name"=>"abcdef"))), "test-for-draft_FileFieldTest1"=>array("name"=>"test"));
$extra_jform_data = array_merge_recursive($a,$b);
echo "<pre>";print_r($extra_jform_data);

& результат

Array
(
[id] => 0
[test-for-draft_FirstName] => testtt
[test-for-draft_subform1] => Array
(
[0] =>
[test-for-draft_subform10] => Array
(
[subform-1_FileField_60] => Array
(
[name] => abcd
)
)

[test-for-draft_subform11] => Array
(
[subform-1_FileField_60] => Array
(
[name] => abcdef
)
)
)

[test-for-draft_FileFieldTest1] => Array
(
[name] => test
)
)

Таким образом, он добавляет клавишу [0] для [test-for-draft_subform1] массив. Я не хочу этого Есть ли какая-нибудь другая функция массива PHP, чтобы избежать этой ситуации.

0

Решение

Ты можешь использовать Массив-фильтр и создать свою собственную функцию, которая делает это рекурсивно, как

function filter_rec($arr) {
$arr = array_filter($arr);
foreach($arr as &$elem)
if (is_array($elem))
$elem = filter_rec($elem);
return $arr;
}

Вызовите эту функцию с вашим массивом

Если все, что вам нужно, это удалить пустой, вы также можете сделать это с array_filter на массивах, прежде чем объединить их

1

Другие решения

Простой способ исправить это поведение (для данного конкретного случая) состоит в циклическом $a массив и удалить все значения, имеющие пустую строку перед слиянием.

foreach($a as $k => $v) {
if($v == '') {
unset($a[$k]);
}
}

Проверьте это здесь

0

Когда одно из обоих значений (которые должны быть объединены) не является массивом, вы хотите, чтобы в результат входило только другое, игнорируя нематериальное значение.

Нет встроенной функции, которая бы делала это, поэтому вам нужно написать свою собственную:

function array_merge_recursive2($a, $b) {
// If one is not an array, give precedence to the other
if (!is_array($a)) return $b;
if (!is_array($b)) return $a;
$merged = [];
foreach(array_merge($a, $b) as $k => $v) {
$merged[$k] = !isset($a[$k]) ? $b[$k]
: (!isset($b[$k]) ? $a[$k]
: array_merge_recursive2($a[$k], $b[$k]));
}
return $merged;
}
0
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector