从数组中删除重复项但合并重复键

时间:2016-03-12 01:04:39

标签: php arrays

这是我确信有一个简单的解决方案的情况之一,我需要帮助才能实现。

假设我们正在处理三个电话号码: home(h) office(o) mobile(m)。我们需要避免向最终用户显示重复的电话号码。

为了更好地解释,这里有三个示例案例(在PHP中):

案例1:

$phone = array(
    'h' => '212-555-1212',
    'o' => '212-555-1212',
    'm' => '212-555-1212'
);

应该屈服:

212-555-1212 (h,o,m)

案例2:

$phone = array(
    'h' => '212-555-1212',
    'o' => '212-555-1234', // different
    'm' => '212-555-1212'
);

应该屈服:

212-555-1212 (h,m)
212-555-1234 (o)

案例3:

$phone = array(
    'h' => null,
    'o' => '212-555-1234',
    'm' => '212-555-1212'
);

应该屈服:

212-555-1234 (o)
212-555-1212 (m)

我已经尝试通过检查每个场景来使用各种case语句,但由于某些值可能为空,这很复杂。 我也曾尝试使用过于复杂的if/elseif/else条件,但同样,它极不优雅。

我尽最大努力是使用array_filter从数组中删除空元素并使用array_unique删除重复项,但后来我丢失了H / O / M键:

$phone = array_filter(array_unique($phone));

我该如何处理?

1 个答案:

答案 0 :(得分:3)

我会先翻转阵列。创建一个以电话号码为密钥的新阵列。像这样:

$numbers = [];
foreach($phone AS $type => $number) { 
    $numbers[$number][] = $type;
}

现在你有一个$numbers数组,包含唯一的手机,每个手机都有一系列类型。

要显示输出,请:

foreach($numbers AS $number => $types) {
    echo $number . " (" . implode(",",$types) . ")";
}

我把它作为一个真正的快速功能包装起来,然后运行你的所有三个案例。您可以在此处查看代码和输出:

https://3v4l.org/U6c4K