这是我确信有一个简单的解决方案的情况之一,我需要帮助来实现它。
假设我们正在处理三个电话号码:家庭(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