【问题标题】:Compare two 2D arrays & get intersection and differences比较两个二维数组并获得交集和差异
【发布时间】:2016-06-01 09:40:27
【问题描述】:

我有两个多维数组..

$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
           
        ));

【问题讨论】:

  • 对于通用数据数组我做了这个..function multi_array_intersect($a, $b) { return strcmp ( $a ['sight_id'], $b ['sight_id'] ); } $common_sights = array_uintersect ( $a1, $a2, 'multi_array_intersect' );
  • 编辑你的问题,解释你做了什么来尝试达到预期的结果。

标签: php multidimensional-array filtering array-difference array-intersect


【解决方案1】:

将数组转换为格式,其中数组索引为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);

【讨论】:

  • 如果将来我必须在该数组中再添加两列怎么办??
  • 那么,不要只存储 $x['location'] 列,而是存储整行 $x 。然后简单地恢复它$only_a2[] = $v
【解决方案2】:

没有必要为了比较行而改变/准备你的二维数组。由于一个数组中的整行与另一个数组中的整行相关,因此您无需指定要比较的列 - 只需比较整行数据即可。

代码:(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',
  ),
)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-19
    • 1970-01-01
    相关资源
    最近更新 更多