Php 计算两个数组之间的差
在PHP中,如何比较两个数组并在第三个数组中得到结果 此结果必须包含旧值和新值。目标是显示一个带有标题的HTML表,如“field | old value | new value”,因为这样,用户可以逐个比较所有值 第一个阵列: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'
$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))在数组维度中获得更多深度,谢谢大家的欣赏!!