比较两个二维数组并获得交集和差异
Compare two 2D arrays & get intersection and differences
我有两个多维数组..
$array1 = [
['sight_id' => 13, 'location' => 'Jodhpur, Rajasthan, India'],
['sight_id' => 14, 'location' => 'Jodhpur Jn, Jodhpur, Rajasthan, India'],
['sight_id' => 15, 'location' => 'D-Kirtinagar, Jodhpur, Rajasthan, India'],
];
$array2 = [
['sight_id' => 13, 'location' => 'Jodhpur, Rajasthan, India'],
['sight_id' => 14, 'location' => 'Jodhpur Jn, Jodhpur, Rajasthan, India'],
['sight_id' => 16, 'location' => 'Jaisalmer, Rajasthan, India'],
['sight_id' => 17, 'location' => 'Fort Road, Amar Sagar Pol, Jaisalmer, Rajasthan, India'],
];
我想将上面给定的数组拆分成三个不同的数组..
$intersect_array=Array
(
[0] => Array
(
[sight_id] => 13
[location] => Jodhpur, Rajasthan, India
)
[1] => Array
(
[sight_id] => 14
[location] => Jodhpur Jn, Jodhpur, Rajasthan, India
));
$only_a1=Array(
[0]=> Array
(
[sight_id] => 15
[location] => D-Kirtinagar, Jodhpur, Rajasthan, India
));
$only_a2=Array(
[1] => Array
(
[sight_id] => 16
[location] => Jaisalmer, Rajasthan, India
)
[2] => Array
(
[sight_id] => 17
[location] => Fort Road, Amar Sagar Pol, Jaisalmer, Rajasthan, India
));
将数组转换为一种格式,其中数组索引为 sight_id:
$b1 =array();
foreach($a1 as $x)
$b1[$x['sight_id']] = $x['location'];
$b2 =array();
foreach($a2 as $x)
$b2[$x['sight_id']] = $x['location'];
计算差值和交集:
$c_intersect = array_intersect_key($b1,$b2);
$c_1 = array_diff_key($b1,$b2);
$c_2 = array_diff_key($b2,$b1);
将数组转换回您的格式:
$intersect_array = array();
foreach($c_intersect as $i=>$v)
$intersect_array[] = array('sight_id'=>$i,'location'=>$v);
$only_a1 = array();
foreach($c_1 as $i=>$v)
$only_a1[] = array('sight_id'=>$i,'location'=>$v);
$only_a2 = array();
foreach($c_2 as $i=>$v)
$only_a2[] = array('sight_id'=>$i,'location'=>$v);
没有必要 mutate/prepare 您的 two-dimensional 数组来比较行。因为一个数组中的整行与另一个数组中的整行相关,所以您无需指定要比较的列 - 只需比较整行数据。
代码:(Demo) (Or with a declared function)
echo "Intersection:\n";
var_export(
array_uintersect($array1, $array2, fn($a, $b) => $a <=> $b)
);
echo "\nUnique in first:\n";
var_export(
array_udiff($array1, $array2, fn($a, $b) => $a <=> $b)
);
echo "\nUnique in second:\n";
var_export(
array_udiff($array2, $array1, fn($a, $b) => $a <=> $b)
);
输出:
Intersection:
array (
0 =>
array (
'sight_id' => 13,
'location' => 'Jodhpur, Rajasthan, India',
),
1 =>
array (
'sight_id' => 14,
'location' => 'Jodhpur Jn, Jodhpur, Rajasthan, India',
),
)
Unique in first:
array (
2 =>
array (
'sight_id' => 15,
'location' => 'D-Kirtinagar, Jodhpur, Rajasthan, India',
),
)
Unique in second:
array (
2 =>
array (
'sight_id' => 16,
'location' => 'Jaisalmer, Rajasthan, India',
),
3 =>
array (
'sight_id' => 17,
'location' => 'Fort Road, Amar Sagar Pol, Jaisalmer, Rajasthan, India',
),
)
我有两个多维数组..
$array1 = [
['sight_id' => 13, 'location' => 'Jodhpur, Rajasthan, India'],
['sight_id' => 14, 'location' => 'Jodhpur Jn, Jodhpur, Rajasthan, India'],
['sight_id' => 15, 'location' => 'D-Kirtinagar, Jodhpur, Rajasthan, India'],
];
$array2 = [
['sight_id' => 13, 'location' => 'Jodhpur, Rajasthan, India'],
['sight_id' => 14, 'location' => 'Jodhpur Jn, Jodhpur, Rajasthan, India'],
['sight_id' => 16, 'location' => 'Jaisalmer, Rajasthan, India'],
['sight_id' => 17, 'location' => 'Fort Road, Amar Sagar Pol, Jaisalmer, Rajasthan, India'],
];
我想将上面给定的数组拆分成三个不同的数组..
$intersect_array=Array
(
[0] => Array
(
[sight_id] => 13
[location] => Jodhpur, Rajasthan, India
)
[1] => Array
(
[sight_id] => 14
[location] => Jodhpur Jn, Jodhpur, Rajasthan, India
));
$only_a1=Array(
[0]=> Array
(
[sight_id] => 15
[location] => D-Kirtinagar, Jodhpur, Rajasthan, India
));
$only_a2=Array(
[1] => Array
(
[sight_id] => 16
[location] => Jaisalmer, Rajasthan, India
)
[2] => Array
(
[sight_id] => 17
[location] => Fort Road, Amar Sagar Pol, Jaisalmer, Rajasthan, India
));
将数组转换为一种格式,其中数组索引为 sight_id:
$b1 =array();
foreach($a1 as $x)
$b1[$x['sight_id']] = $x['location'];
$b2 =array();
foreach($a2 as $x)
$b2[$x['sight_id']] = $x['location'];
计算差值和交集:
$c_intersect = array_intersect_key($b1,$b2);
$c_1 = array_diff_key($b1,$b2);
$c_2 = array_diff_key($b2,$b1);
将数组转换回您的格式:
$intersect_array = array();
foreach($c_intersect as $i=>$v)
$intersect_array[] = array('sight_id'=>$i,'location'=>$v);
$only_a1 = array();
foreach($c_1 as $i=>$v)
$only_a1[] = array('sight_id'=>$i,'location'=>$v);
$only_a2 = array();
foreach($c_2 as $i=>$v)
$only_a2[] = array('sight_id'=>$i,'location'=>$v);
没有必要 mutate/prepare 您的 two-dimensional 数组来比较行。因为一个数组中的整行与另一个数组中的整行相关,所以您无需指定要比较的列 - 只需比较整行数据。
代码:(Demo) (Or with a declared function)
echo "Intersection:\n";
var_export(
array_uintersect($array1, $array2, fn($a, $b) => $a <=> $b)
);
echo "\nUnique in first:\n";
var_export(
array_udiff($array1, $array2, fn($a, $b) => $a <=> $b)
);
echo "\nUnique in second:\n";
var_export(
array_udiff($array2, $array1, fn($a, $b) => $a <=> $b)
);
输出:
Intersection:
array (
0 =>
array (
'sight_id' => 13,
'location' => 'Jodhpur, Rajasthan, India',
),
1 =>
array (
'sight_id' => 14,
'location' => 'Jodhpur Jn, Jodhpur, Rajasthan, India',
),
)
Unique in first:
array (
2 =>
array (
'sight_id' => 15,
'location' => 'D-Kirtinagar, Jodhpur, Rajasthan, India',
),
)
Unique in second:
array (
2 =>
array (
'sight_id' => 16,
'location' => 'Jaisalmer, Rajasthan, India',
),
3 =>
array (
'sight_id' => 17,
'location' => 'Fort Road, Amar Sagar Pol, Jaisalmer, Rajasthan, India',
),
)