在 PHP 中执行数组交集时如何保留多维数组信息?
Posted
技术标签:
【中文标题】在 PHP 中执行数组交集时如何保留多维数组信息?【英文标题】:How can I preserve multidimensional array information when performing array intersections in PHP? 【发布时间】:2012-05-05 02:41:31 【问题描述】:我有许多包含一个 ID 作为主键的数组,每个 id 下都有多维信息。这里有两个例子:
第一个示例数组:
array
14181 =>
array
'industries' =>
array
'weight' => string '105652' (length=6)
'count' => string '11' (length=2)
48354 =>
array
'industries' =>
array
'weight' => string '508866' (length=6)
'count' => string '10' (length=2)
第二个示例数组:
array
16434 =>
array
'business_types' =>
array
'weight' => string '104614' (length=6)
'count' => string '1' (length=1)
48354 =>
array
'business_types' =>
array
'weight' => string '103610' (length=6)
'count' => string '10' (length=2)
我想获得许多这样的数组的交集(基于键),但我需要为每个键保留每个数组的权重和计数数据。请注意,每个数组的权重和计数数据不同。在这种情况下,business_type 和行业。
需要最终数组:
array
48354 =>
array
'business_types' =>
array
'weight' => string '103610' (length=6)
'count' => string '10' (length=2)
'industries' =>
array
'weight' => string '508866' (length=6)
'count' => string '10' (length=2)
最初我并不想保持重量和计数,所以我只是执行array_intersect_keys()
并完成了工作。现在我需要保留这些数据。我将子数组命名为不同的东西,希望array_intersect_keys()
会保留它,但是,它只保留函数中的第一个数组。
有没有首选的方法来做这样的事情?
我能想到的唯一解决方案是将所有数组简化为最终 ID (keys) 的列表,然后循环遍历该数组,从我们比较的每个原始数组中提取权重和计数信息。
【问题讨论】:
您建议的解决方案对我来说听起来不错。 我刚刚给你写了一个数组合并,但现在我重新阅读它,你正在寻找一个交叉点,对吗? 我需要做一个交集但也需要合并数据。我认为您只是按照我的解决方案的相反顺序执行了此操作,但这可能仍然有效。 【参考方案1】:您提出的解决方案看起来不错,但您可能会考虑将一个列表合并到另一个列表中,例如
<?php
$a1 = array(14181 => array('industries' => array('weight' => "105652", 'count' => "11")),
48354 => array('industries' => array('weight' => "508866", 'count' => "10")));
$a2 = array(16434 => array('business_types' => array('weight' => "104614", 'count' => "1")),
48354 => array('business_types' => array('weight' => "103610", 'count' => "10")));
//print_r($a1);
//print_r($a2);
foreach($a2 as $a2k => $a2v)
// The loop below should only go through once, but if there are multiple types it will be ok
foreach($a2v as $a2vk => $a2vv)
$a1[$a2k][$a2vk] = $a2vv;
printf("Output:\n");
print_r($a1);
printf("Output:\n");
print_r($a1);
输出:
Output:
Array
(
[14181] => Array
(
[industries] => Array
(
[weight] => 105652
[count] => 11
)
)
[48354] => Array
(
[industries] => Array
(
[weight] => 508866
[count] => 10
)
[business_types] => Array
(
[weight] => 103610
[count] => 10
)
)
[16434] => Array
(
[business_types] => Array
(
[weight] => 104614
[count] => 1
)
)
)
我相信这会比您提出的解决方案略快。
编辑: 上面是一个数组合并类型算法,即使数组中的键不常见,它也会合并数组。下面的算法只会产生两个数组的交集。最初收到问题是我的错:
<?php
$a1 = array(14181 => array('industries' => array('weight' => "105652", 'count' => "11")),
48354 => array('industries' => array('weight' => "508866", 'count' => "10")));
$a2 = array(16434 => array('business_types' => array('weight' => "104614", 'count' => "1")),
48354 => array('business_types' => array('weight' => "103610", 'count' => "10")));
//print_r($a1);
//print_r($a2);
// Pass the smaller array as first argument
if(count($a1) <= count($a2))
$res = my_merge($a1, $a2);
else
$res = my_merge($a2, $a1);
function my_merge($a1, $a2)
$res = array();
foreach($a1 as $a1k => $a1v)
if(array_key_exists($a1k, $a2))
$res[$a1k] = array_merge($a1[$a1k], $a2[$a1k]);
return $res;
printf("Output:\n");
print_r($res);
输出:
Array
(
[48354] => Array
(
[industries] => Array
(
[weight] => 508866
[count] => 10
)
[business_types] => Array
(
[weight] => 103610
[count] => 10
)
)
)
【讨论】:
然后如何将组合数组减少为所有原始数组中的 ID(和子数组)......或者,在这种情况下,减少为同时具有行业和业务类型权重的 ID和计数? 我编辑了我的帖子并添加了交集算法而不是合并算法。是的,您可以使用合并然后减少它,但我认为我在编辑中使用的方法会更快。以上是关于在 PHP 中执行数组交集时如何保留多维数组信息?的主要内容,如果未能解决你的问题,请参考以下文章