PHP 深度扩展数组

2022-08-30 19:12:47

如何对多维关联数组(用于解码的 JSON 对象)进行深度扩展。我需要jQuery的$.extend(true,array1,array2)php等效物,其中数组而不是JSON和PHP。

以下是我需要的一个例子(array_merge_recursive似乎没有做同样的事情)

$array1 = ('1'=> ('a'=>'array1a', 'b'=>'array1b'));
$array2 = ('1'=> ('a'=>'array2a', 'c'=>'array2b'));

$array3 = array_extend($array1, $array2);

//$array3 = ('1'=> ('a'=>'array2a', 'b'=>'array1b', 'c'=>'array2b'))

请注意 array2 如果具有相同的值,它将如何覆盖 array1(如类的扩展工作方式)


答案 1

如果你有 PHP 5.3.0+,你可以使用 array_replace_recursive 它完全符合你的需要:

array_replace_recursive() 将 array1 的值替换为以下所有数组中的相同值。如果第二个数组中存在第一个数组中的键,则其值将替换为第二个数组中的值。如果密钥存在于第二个数组中,而不是第一个数组中,则将在第一个数组中创建该密钥。如果某个键仅存在于第一个数组中,则该键将保持原样。如果传递多个数组进行替换,则将按顺序处理它们,后面的数组将覆盖前面的值。


答案 2

这可能是您要查找的内容:

function array_extend(&$result) {
  if (!is_array($result)) {
    $result = array();
  }

  $args = func_get_args();

  for ($i = 1; $i < count($args); $i++) {
    // we only work on array parameters:
    if (!is_array($args[$i])) continue;

    // extend current result:
    foreach ($args[$i] as $k => $v) {
      if (!isset($result[$k])) {
        $result[$k] = $v;
      }
      else {
        if (is_array($result[$k]) && is_array($v)) {
          array_extend($result[$k], $v);
        }
        else {
          $result[$k] = $v;
        }
      }
    }
  }

  return $result;
}

用法:

$arr1 = array('a' => 1, 'b' => 2, 'c' => 3);
$arr2 = array('b' => 'b', 'd' => 'd');
array_extend($arr1, $arr2);
print_r($arr1); // array('a' => 1, 'b' => 'b', 'c' => 3, 'd' => 'd')

// or, to create a new array and leave $arr1 unchanged use:
array_extend($arr3, $arr1, $arr2);
print_r($arr3); // array('a' => 1, 'b' => 'b', 'c' => 3, 'd' => 'd')

// or, use the return value:
print_r(array_extend($arr1, $arr2)); // but this will also modify $arr1

推荐