抱歉,如果之前有人问过这个问题,但我搜索了很多,找不到解决方案。 我已经尝试解决这个问题一段时间了,但无法为其编写函数。
我有一个这样的数组:
$numbers = array(
array("tag" => "developer", "group" => "grp_1", "num" => "123123"),
array("tag" => "developer", "group" => "grp_2", "num" => "111111"),
array("tag" => "student", "group" => "grp_1", "num" => "123123"),
array("tag" => "student", "group" => "grp_2", "num" => "123123"),
array("tag" => "developer", "group" => "grp_3", "num" => "111111"),
);
我需要编写一个函数,根据多个键从这个数组中删除重复项,所以我的函数调用应该看起来像这样:
unique_by_keys($numbers, array("num","group"));
换句话说,一个数字不能在同一组中多次。
通过数组调用 unique_by_keys() 后应该是这样的:
$numbers = array(
array("tag" => "developer", "group" => "grp_1", "num" => "123123"),
array("tag" => "developer", "group" => "grp_2", "num" => "111111"),
array("tag" => "student", "group" => "grp_2", "num" => "123123"),
array("tag" => "developer", "group" => "grp_3", "num" => "111111"),
);
如果你能帮助我找到解决方案,或者引导我找到正确的思维方式,我将不胜感激。 谢谢!
解决方案: 通过编写以下函数,我能够找到解决方案: (我以一种接受多种形式的 $haystack 数组的方式编写它)
function unique_by_keys($haystack = array(), $needles = array()) {
if (!empty($haystack) && !empty($needles)) {
$_result = array();
$result = array();
$i = 0;
foreach ($haystack as $arrayObj) {
if (is_array($arrayObj)) {
$searchArray = array();
foreach ($needles as $needle) {
if (isset($arrayObj[$needle])) {
$searchArray[$needle] = $arrayObj[$needle];
}
}
if (!in_array($searchArray, $_result)) {
foreach ($arrayObj as $key => $value) {
if (in_array($key, $needles)) {
$_result[$i][$key] = $value;
}
}
$result[] = array_merge($_result[$i], $arrayObj);
}
} else {
$result[] = $arrayObj;
}
$i++;
}
return $result;
}
}
谢谢大家的回复!
创建表示目标/过滤列值的复合字符串键——这将确保在过滤时有足够的唯一标识。
使用“空合并赋值运算符”(
??=
)将确保只保留第一个遇到的符合条件的行。
代码:(演示)
function unique_by_keys(array $haystack, array $needles): array {
$columnNames = array_flip($needles);
$result = [];
foreach ($haystack as $row) {
$compositeKey = implode('|', array_intersect_key($row, $columnNames));
$result[$compositeKey] ??= $row;
}
return array_values($result);
}
var_export(
unique_by_keys($numbers, ["group", "num"])
);
$newNumbers = array();
foreach($numbers as $key=>$values){
$newkey = $values['group'].'__'.$values['num'];
$newNumbers[$newkey] = $values;
}
var_dump($newNumbers)
代码可能效率不高,但我会为你工作:)
$result = unique_by_keys($numbers, array("num","group"));
echo "<pre>";
print_R($result);
function unique_by_keys($numbers, $arr){
$new_array = array();
$output = array();
foreach ($numbers as $n){
if(isset($new_array[$n[$arr[1]]]) && $new_array[$n[$arr[1]]] == $n[$arr[0]]){
continue;
}else{
$new_array[$n[$arr[1]]] = $n[$arr[0]];
$output[] = $n;
}
}
return $output;
}