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


Removing duplicate items from array but merging duplicate keys

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

假设我们正在处理三个电话号码:家庭(h),办公室(o)手机(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));

我应该如何处理这个问题?

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

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

现在,您有一个$numbers数组,其中包含唯一的电话,以及每个电话的类型数组。

要显示您的输出,请执行以下操作:

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

我已将其总结为一个真正的快速功能,并运行您的所有三个案例。您可以在此处查看代码和输出:

https://3v4l.org/U6c4K