PHP:按键删除对象数组中的所有重复项,第一个除外

PHP: remove from array of objects all duplicates by key, except first one

我有以下对象关联数组:

[
    0: {
        "score": "value2",
        "number": "1",
        "finalScore": "-1"
    },

    1: {
        "score": "value3",
        "number": "2",
        "finalScore": "5"
    },

    2: {
        "score": "value4",
        "number": "2",
        "finalScore": "5"
    },

    3: {
        "score": "value5",
        "number": "3",
        "finalScore": "-1"
    }
]

请记住以下格式是浏览器上经过美化的 JSON 字符串,从 PHP 通过 echo json_encode($result)[=30 返回后=]

我需要根据 number 属性 值过滤它,以便删除 number 属性 [=29 具有相同值的所有重复项=]除了第一个。这意味着如果两个或多个对象共享 number 的相同值,则只应保留第一个。

鉴于此解释,上述示例中的过滤数组将产生:

[
    0: {
        "score": "value2",
        "number": "1",
        "finalScore": "-1"
    },

    1: {
        "score": "value3",
        "number": "2",
        "finalScore": "5"
    },

    2: {
        "score": "value5",
        "number": "3",
        "finalScore": "-1"
    }
]

我试了几次,最接近的是这个函数:

function array_iunique($array) {
    $lowered = array_map('strtolower', $array);
    return array_intersect_key($array, array_unique($lowered));
}

对我来说听起来很直接:迭代输入数组并仅在输出尚未包含此类候选者时才接受元素...

<?php
$input = json_decode(<<<EOT
[
    {
        "score": "value2",
        "number": "1",
        "finalScore": "-1"
    }, {
        "score": "value3",
        "number": "2",
        "finalScore": "5"
    }, {
        "score": "value4",
        "number": "2",
        "finalScore": "5"
    }, {
        "score": "value5",
        "number": "3",
        "finalScore": "-1"
    }
]
EOT);

$output = [];
array_walk($input, function ($entry) use (&$output) {
    if (!array_key_exists($entry->number, $output)) {
        $output[$entry->number] = $entry;
    }
}); 

print_r(array_values($output));

输出显然是:

Array
(
    [0] => stdClass Object
        (
            [score] => value2
            [number] => 1
            [finalScore] => -1
        )
    [1] => stdClass Object
        (
            [score] => value3
            [number] => 2
            [finalScore] => 5
        )
    [2] => stdClass Object
        (
            [score] => value5
            [number] => 3
            [finalScore] => -1
        )
)

简单方法:

  1. 首先,使用 json_decode 和第二个参数 true.
  2. 将数据从 json 格式转换为分数数组
  3. 其次,为输出创建三个变量一 $scores_filtered,第二个仅跟踪唯一数字,$index 保持 $scores_filtered 数组的升序。
  4. 第三步,遍历分数数组,检查数字是否第一次出现(意思是数组$unique_numbers中不存在),如果是,则将其存储在$unique_numbers中。获取该分数并存储在 $scores_filtered 数组中。
$json = '[{
        "score": "value2",
        "number": "1",
        "finalScore": "-1"
    },{
        "score": "value3",
        "number": "2",
        "finalScore": "5"
    },{
        "score": "value4",
        "number": "2",
        "finalScore": "5"
    },{
        "score": "value5",
        "number": "3",
        "finalScore": "-1"
    }
]';
$scores = json_decode($json, true);
$scores_filtered = [];
$unique_numbers = [];
$index = 0;
for($i = 0; $i < count($scores); $i++) {
    $score = $scores[$i];
    if(!in_array($score['number'], $unique_numbers)){
        $unique_numbers[] = $score['number'];
        $scores_filtered[$index]["score"] = $score["score"];
        $scores_filtered[$index]["number"] = $score["number"];
        $scores_filtered[$index]["finalScore"] = $score["finalScore"];
        $index += 1;
    }
}

输出:

echo "<pre>";
print_r(json_encode($scores_filtered, JSON_PRETTY_PRINT));
/*
[
    {
        "score": "value2",
        "number": "1",
        "finalScore": "-1"
    },
    {
        "score": "value3",
        "number": "2",
        "finalScore": "5"
    },
    {
        "score": "value5",
        "number": "3",
        "finalScore": "-1"
    }
]
*/