【问题标题】:PHP array_merge_recursive function with empty values具有空值的 PHP array_merge_recursive 函数
【发布时间】:2019-01-02 08:58:47
【问题描述】:

我有以下两个数组并使用了 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
        )
)

因此,它为 [test-for-draft_subform1] 数组添加了 [0] 键。我不想要这个。有没有其他 PHP 数组函数可以避免这种情况。

【问题讨论】:

  • 你的 $b 数组指定 test-for-draft_subform1 包含一个数组,你没有指定一个键,所以它变成了 0。 var_dump($b) 你会明白我的意思。 array_merge_recursive 正在按预期工作。
  • 创建自己的函数。
  • @AneesSaban test-for-draft_subform1 将始终在第二个数组中为我提供一个数组,即 $b
  • 所以你不想合并,你实际上希望$b["test-for-draft_subform1"]中的数组扔掉你会得到的空字符串$a["test-for-draft_subform1"].
  • @Mangesh 你可以在合并之前在两个数组上调用array_filter...检查我的答案

标签: php arrays multidimensional-array array-merge


【解决方案1】:

您可以使用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 进行此操作

【讨论】:

    【解决方案2】:

    解决此行为的一种简单方法(对于这种特殊情况)是循环遍历 $a 数组并在合并之前删除所有具有空字符串的值。

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

    Test it here

    【讨论】:

      【解决方案3】:

      当两个值(需要合并的)之一不是数组时,您只希望另一个进入结果,忽略非数组值。

      没有内置函数可以做到这一点,因此您需要自己编写:

      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;
      }
      

      【讨论】:

        猜你喜欢
        • 2011-01-04
        • 1970-01-01
        • 2012-08-16
        • 2011-01-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-08-04
        • 2015-02-01
        相关资源
        最近更新 更多