PHP array_merge_recursive функция с пустыми значениями - PullRequest
0 голосов
/ 02 января 2019

У меня есть два массива ниже, и я использовал функцию 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, чтобы избежать этой ситуации.

Ответы [ 3 ]

0 голосов
/ 02 января 2019

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

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

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

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

0 голосов
/ 02 января 2019

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

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

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 голосов
/ 02 января 2019

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

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

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

...