Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/231.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 计算两个数组之间的差_Php_Arrays - Fatal编程技术网

Php 计算两个数组之间的差

Php 计算两个数组之间的差,php,arrays,Php,Arrays,在PHP中,如何比较两个数组并在第三个数组中得到结果 此结果必须包含旧值和新值。目标是显示一个带有标题的HTML表,如“field | old value | new value”,因为这样,用户可以逐个比较所有值 第一个阵列: $array1 = array( 'key1' => array( 'key1.1' => 'value', 'key1.2' => 'value', ), 'key2' => array( 'key2.1'

在PHP中,如何比较两个数组并在第三个数组中得到结果

此结果必须包含旧值和新值。目标是显示一个带有标题的HTML表,如“field | old value | new value”,因为这样,用户可以逐个比较所有值

第一个阵列:

$array1 = array(
  'key1' => array(
    'key1.1' => 'value',
    'key1.2' => 'value',
  ),
  'key2' => array(
    'key2.1' => 'value',
    'key2.2' => 'value',
  ),
  'key3' => array(
    array('key3.1' => 'value'),
    array('key3.2' => 'value'),
  ),
);
第二个阵列:

$array2 = array(
  'key1' => array(
    'key1.1' => 'value',
    'key1.2' => 'value',
  ),
  'key2' => array(
    'key2.1' => 'value',
    'key2.2' => 'value',
  ),
  'key3' => array(
    array('key3.1' => 'value'),
    array('key3.2' => 'value'),
  ),
);
我所期望的是:

$results = array(
  'key1' => array(
    'key1.1' => array(
      'old' => 'old_value',
      'new' => 'new_value',
    ),
    'key1.2' => array(
      'old' => 'old_value',
      'new' => 'new_value',
    ),
  ),
  'key2' => array(
    'key2.1' => array(
      'old' => 'old_value',
      'new' => 'new_value',
    ),
    'key2.2' => array(
      'old' => 'old_value',
      'new' => 'new_value',
    ),
  ),
  'key3' => array(
    array(
      'key3.1' => array(
        'old' => 'old_value',
        'new' => 'new_value')
    ),
    array(
      'key3.1' => array(
        'old' => 'old_value',
        'new' => 'new_value'),
    )
  ),
);
我已经尝试过但没有成功:

function array_diff_assoc_recursive($array1, $array2) {

  $exclude = array(
    'custom_key'
  );

  $difference = array();
  foreach($array1 as $key => $value) {
    if(is_array($value)){
      if( !isset($array2[$key]) || !is_array($array2[$key]) ) {
        if(!in_array($key,$exclude)){
          $difference[$key]['old'] = $value;
          $difference[$key]['new'] = $array2[$key];
        }
      } else {
        $new_diff = array_diff_assoc_recursive($value, $array2[$key]);
        if(!empty($new_diff))
          $difference[$key] = $new_diff;
      }
    } else if(!array_key_exists($key,$array2) || $array2[$key] !== $value) {
      if(!in_array($key,$exclude)){
        $difference[$key]['old'] = $value;
        $difference[$key]['new'] = $array2[$key];
      }
    }
  }
  return $difference;
}

使用array\u walk\u recursive准备数组,并将它们组合起来。请注意,原始阵列将被更改

array_walk_recursive($array1, function(&$i) { if(!is_array($i)) $i = array('old'=> $i); });
array_walk_recursive($array2, function(&$i) { if(!is_array($i)) $i = array('new'=> $i); });

print_r(array_merge_recursive($array1, $array2));

使用array\u walk\u recursive准备数组,并将它们组合起来。请注意,原始阵列将被更改

array_walk_recursive($array1, function(&$i) { if(!is_array($i)) $i = array('old'=> $i); });
array_walk_recursive($array2, function(&$i) { if(!is_array($i)) $i = array('new'=> $i); });

print_r(array_merge_recursive($array1, $array2));

试试这段代码,我相信这会对你有用

 <?php 
echo "<pre>";
$array1 = array(
  'key1' => array(
    'key1.1' => 'aaa',
    'key1.2' => 'xxx',
    'key1.3' => 'vvv',
  ),
  'key2' => array(
    'key2.1' => 'eee',
    'key2.2' => 'fff',
    'key2.3' => 'ggg',
  ),
) ;
echo "Array 1: </br>";
print_r($array1);

$array2 = array(
  'key1' => array(
    'key1.1' => 'aaa',
    'key1.2' => 'ddd',
    'key1.3' => 'ccc',
  ),
  'key2' => array(
    'key2.1' => 'hhh',
    'key2.2' => 'fff',
    'key2.3' => 'ttt',
  ),
); 
echo "Array 2:</br>";
print_r($array2);

$result='';
foreach($array1 as $key=> $val)
{
    foreach($val as $k=> $v)
    {
        if($v != $array2[$key][$k])
        {
            $result[$key][$k]['old']= $array2[$key][$k] ;
            $result[$key][$k]['new']= $v;
        }       
    }
}
echo "Compared Result: </br>";
echo "<pre>"; print_r($result);
?>

试试这个代码,我相信它会对你有用

 <?php 
echo "<pre>";
$array1 = array(
  'key1' => array(
    'key1.1' => 'aaa',
    'key1.2' => 'xxx',
    'key1.3' => 'vvv',
  ),
  'key2' => array(
    'key2.1' => 'eee',
    'key2.2' => 'fff',
    'key2.3' => 'ggg',
  ),
) ;
echo "Array 1: </br>";
print_r($array1);

$array2 = array(
  'key1' => array(
    'key1.1' => 'aaa',
    'key1.2' => 'ddd',
    'key1.3' => 'ccc',
  ),
  'key2' => array(
    'key2.1' => 'hhh',
    'key2.2' => 'fff',
    'key2.3' => 'ttt',
  ),
); 
echo "Array 2:</br>";
print_r($array2);

$result='';
foreach($array1 as $key=> $val)
{
    foreach($val as $k=> $v)
    {
        if($v != $array2[$key][$k])
        {
            $result[$key][$k]['old']= $array2[$key][$k] ;
            $result[$key][$k]['new']= $v;
        }       
    }
}
echo "Compared Result: </br>";
echo "<pre>"; print_r($result);
?>

向我们展示您所尝试的
array\u merge\u recursive
获得的几乎是您想要的,只有0和1,而不是旧的和新的。我编辑了我的第一篇文章,添加了更多的数组示例和我尝试的函数,但没有得到我想要的。向我们展示您所尝试的
array\u merge\u recursive
获得的几乎是您想要的,只有0和1,而不是0新旧我编辑了我的第一篇文章,添加了更多的数组示例和我尝试的函数,但没有得到我所期望的结果。如果更改了原始数组,这不是问题,我不需要保存更改。但是,作为array\u merge\u recursive(),如果我在原始数组中添加'key3'=>array(array('key3.1'=>'value')、array('key3.2'=>'value')),那么您的示例就不会运行了……是的,这会改变数组结构,代码不会运行更好?在调用数组合并之前转换第三个键,或者在数组合并中添加条件?我更喜欢FIRSTIF如果更改了原始数组,这不是问题,我不需要保存更改。但是,作为array\u merge\u recursive(),如果我在原始数组中添加'key3'=>array(array('key3.1'=>'value')、array('key3.2'=>'value')),那么您的示例就不会运行了……是的,这会改变数组结构,代码不会运行更好?在调用数组合并之前转换第三个键,或者在数组合并中添加一个条件?我更喜欢FirstPerfect:)我刚刚添加了一个条件,以便在数组维度中获得更多深度,如果(is_array($v)),谢谢您的欣赏!!完美:)我刚刚添加了一个条件,如果(is_array($v))在数组维度中获得更多深度,谢谢大家的欣赏!!