我有两个多维数组,我想要区别。例如。我在
下面采用了二维两个数组$array1 = Array (
[a1] => Array (
[a_name] => aaaaa
[a_value] => aaa
)
[b1] => Array (
[b_name] => bbbbb
[b_value] => bbb
)
[c1] => Array (
[c_name] => ccccc
[c_value] => ccc
)
)
$array2 = Array (
[b1] => Array (
[b_name]=> zzzzz
)
)
现在我想要这两个数组的关键区别。我尝试过array_diff_key()但它不适用于多维。
array_diff_key($array1, $array2)
我希望输出如下
//output
$array1 = Array (
[a1] => Array (
[a_name] => aaaaa
[a_value] => aaa
)
[b1] => Array (
[b_value] => bbb
)
[c1] => Array (
[c_name] => ccccc
[c_value] => ccc
)
)
如果您认为我的问题是真的,请接受并回答。谢谢。
修改
现在,如果第二个数组是
$array2 = Array( [b1] => zzzzz)
结果应为
$array1 = Array (
[a1] => Array (
[a_name] => aaaaa
[a_value] => aaa
)
[c1] => Array (
[c_name] => ccccc
[c_value] => ccc
)
)
答案 0 :(得分:11)
请检查我是否理解正确,然后此代码段可以帮助您解决问题。我已经针对您指定的问题对其进行了测试。如果还有其他要运行它的测试用例,可以告诉我调整代码。
$a1 = array(
'a1' => array('a_name' => 'aaa', 'a_value' => 'aaaaa'),
'b1' => array('b_name' => 'bbb', 'b_value' => 'bbbbbb'),
'c1' => array('c_name' => 'ccc', 'c_value' => 'cccccc')
);
$a2 = array(
'b1' => array('b_name' => 'zzzzz'),
);
$result = check_diff_multi($a1, $a2);
print '<pre>';
print_r($result);
print '</pre>';
function check_diff_multi($array1, $array2){
$result = array();
foreach($array1 as $key => $val) {
if(isset($array2[$key])){
if(is_array($val) && $array2[$key]){
$result[$key] = check_diff_multi($val, $array2[$key]);
}
} else {
$result[$key] = $val;
}
}
return $result;
}
编辑:在代码中添加了调整。
答案 1 :(得分:4)
这个解决方案啊对我很有帮助我希望能帮助他们做些什么,无论阵列是什么混乱。
function your_array_diff($arraya, $arrayb) {
foreach ($arraya as $keya => $valuea) {
if (in_array($valuea, $arrayb)) {
unset($arraya[$keya]);
}
}
return $arraya;
}
$a1 = Array
(
"0" => Array
(
"Empresa" => "TMC01",
"Paga" => "13/01/2015",
"ID" => "M2",
"Valor" => "200",
"Nombre" => "BONI"
),
"1" => Array
(
"Empresa" => "TMC01",
"Paga" => "13/01/2015",
"ID" => "M1",
"Valor" => "100",
"Nombre" => "SUELDO"
)
);
$b1 = Array
(
"0" => Array
(
"Empresa" => "TMC01",
"Paga" => "13/01/2015",
"ID" => "M1",
"Valor" => "100",
"Nombre" => "SUELDO"
),
"1" => Array
(
"Empresa" => "TMC01",
"Paga" => "13/01/2015",
"ID" => "M2",
"Valor" => "200",
"Nombre" => "BONI"
)
);
$resultado = your_array_diff($a1, $b1);
echo "<pre>";
echo print_r($resultado);
echo "</pre>";
答案 2 :(得分:4)
有很多案例,原始答案无法正常运作,所以我写了一个更好的解决方案。其中一个问题是,如果删除了数组2中的属性,则其他函数无法识别它。
function check_diff_multi($array1, $array2){
$result = array();
foreach($array1 as $key => $val) {
if(is_array($val) && isset($array2[$key])) {
$tmp = check_diff_multi($val, $array2[$key]);
if($tmp) {
$result[$key] = $tmp;
}
}
elseif(!isset($array2[$key])) {
$result[$key] = null;
}
elseif($val !== $array2[$key]) {
$result[$key] = $array2[$key];
}
if(isset($array2[$key])) {
unset($array2[$key]);
}
}
$result = array_merge($result, $array2);
return $result;
}
我还添加了测试用例来检查结果:
正如您所看到的,我的功能提供了更好的结果。
答案 3 :(得分:2)
我知道这个帖子有点陈旧,但是我遇到了原始解决方案的一些问题。所以这是我对问题的解决方案。
private function array_diff_recursive($array1, $array2){
$result = [];
foreach($array1 as $key => $val) {
if(array_key_exists($key, $array2)){
if(is_array($val) || is_array($array2[$key])) {
if (false === is_array($val) || false === is_array($array2[$key])) {
$result[$key] = $val;
} else {
$result[$key] = $this->array_diff_recursive($val, $array2[$key]);
if (sizeof($result[$key]) === 0) {
unset($result[$key]);
}
}
}
} else {
$result[$key] = $val;
}
}
return $result;
}
遇到/修复的问题
答案 4 :(得分:1)
几乎是@ bernhardh的答案副本,但是因为我的编辑被拒绝而在此发帖。使用+而不是array_merge作为array_merge将reindex数组导致索引数组的问题。
/**
* Given 2 arrays see what has changed when comparing defaults to the new values.
*
* @param array $defaults
* Array of default values.
* @param mixed $new_values
* Array of new values.
*
* @return array
* Nested array strucutre; only the diff.
*/
function array_diff_multi(array $defaults, $new_values) {
$result = array();
foreach ($defaults as $key => $val) {
if (is_array($val) && isset($new_values[$key])) {
$tmp = array_diff_multi($val, $new_values[$key]);
if ($tmp) {
$result[$key] = $tmp;
}
}
elseif (!isset($new_values[$key])) {
$result[$key] = NULL;
}
elseif ($val != $new_values[$key]) {
$result[$key] = $new_values[$key];
}
if (isset($new_values[$key])) {
unset($new_values[$key]);
}
}
$result = $result + $new_values;
return $result;
}
答案 5 :(得分:0)
@Zaheer Abbass解决方案的一个小调整,我得到了我想要的结果。非常感谢Zaheer。这是我使用的最终代码。
function check_diff_multi($array1, $array2){
$result = array();
foreach($array1 as $key => $val) {
if(isset($array2[$key])){
if(is_array($val) && is_array($array2[$key])){
$result[$key] = check_diff_multi($val, $array2[$key]);
}
} else {
$result[$key] = $val;
}
}
return $result;
}
答案 6 :(得分:0)
因此,如果您的数组具有空值或空数组。
private function check_diff_multi($array1, $array2){
$result = array();
foreach($array1 as $key => $val) {
if(array_key_exists($key,$array2)){
if(is_array($val) && is_array($array2[$key]) && !empty($val)){
$result[$key] = $this->check_diff_multi($val, $array2[$key]);
}
} else {
$result[$key] = $val;
}
}
return $result;
}
答案 7 :(得分:0)
$out = array_diff_assoc_recursive($array1, $array2);
该解决方案需要递归数组的值,这些数组本身可能是数组。
function array_diff_assoc_recursive($array1, $array2)
{
foreach($array1 as $key => $value)
{
if(is_array($value))
{
if(!isset($array2[$key]))
{
$difference[$key] = $value;
}
elseif(!is_array($array2[$key]))
{
$difference[$key] = $value;
}
else
{
$new_diff = array_diff_assoc_recursive($value, $array2[$key]);
if($new_diff != FALSE)
{
$difference[$key] = $new_diff;
}
}
}
elseif(!isset($array2[$key]) || $array2[$key] != $value)
{
$difference[$key] = $value;
}
}
return !isset($difference) ? 0 : $difference;
}
答案 8 :(得分:0)
尝试功能:
<?php
$input = ['blue' => 1, 'white' => ['purple' => 4, 'green' => 3], 'red' => 2];
$filter = ['blue' => 6, 'white' => ['yellow' => 7, 'green' => 5], 'red' => 2];
/**
* @param array $input
* @param array $filter
* @return array
*/
function multidimensionalArrayDiffKey(array $input, array $filter)
{
if ($diff = array_diff_key($input, $filter)){
return $diff;
}else{
foreach($input as $key => $value){
if(is_array($value) && $diff = multidimensionalArrayDiffKey($value, $filter[$key])){
return [$key => $diff];
}
}
}
return [];
}
print_r(multidimensionalArrayDiffKey($input, $filter));
结果:
Array
(
[white] => Array
(
[purple] => 4
)
)
答案 9 :(得分:0)
对于多维数组,array_diff_assoc
在某些情况下比array_diff
效果更好。我遇到array_diff
的问题,它无法将1或0区分为值(可能其他一些索引具有相同的值),因此array_diff_assoc
在检查索引时解决了它。仅适用于可能遇到相同问题的未来用户。
答案 10 :(得分:0)
{{1}}
答案 11 :(得分:0)
print_r(array_diff_key($ array1,$ array2));