Php 元素被洗牌时的数组映射

Php 元素被洗牌时的数组映射,php,shuffle,array-map,Php,Shuffle,Array Map,我有这个数组(它只是其中的一部分)。6=问题ID,选项ID=可能的答案 Array ( [3] => Array ( [0] => 6 [1] => Array ( [0] => Array ( [optionID] => 16

我有这个数组(它只是其中的一部分)。6=问题ID,选项ID=可能的答案

Array
 (
    [3] => Array
        (
        [0] => 6
        [1] => Array
            (
                [0] => Array
                    (
                        [optionID] => 16
                        [isCorrect] => 0
                    )

                [1] => Array
                    (
                        [optionID] => 14
                        [isCorrect] => 1
                    )

                [2] => Array
                    (
                        [optionID] => 15
                        [isCorrect] => 0
                    )

                [3] => Array
                    (
                        [optionID] => 17
                        [isCorrect] => 0
                    )

            )

    )

[7] => Array
    (
        [0] => 6
        [1] => Array
            (
                [0] => Array
                    (
                        [optionID] => 16
                        [isCorrect] => 0
                    )

                [1] => Array
                    (
                        [optionID] => 15
                        [isCorrect] => 0
                    )

                [2] => Array
                    (
                        [optionID] => 17
                        [isCorrect] => 0
                    )

                [3] => Array
                    (
                        [optionID] => 14
                        [isCorrect] => 1
                    )

            )

    )

)
我正在尝试将冗余问题(6和6)与数组_映射合并:

    $unique = array_map('unserialize', array_unique(array_map('serialize', $quizQuestionArray)));

只要optionID的顺序相同,它就可以工作。但在某些情况下(比如这里),它们被洗牌(16,14,15,17)(16,15,17,14)。有没有办法让它们乱序并删除重复的问题?

在应用array\u map()函数之前,您需要将它们按相同的顺序排序。您可以使用该函数并提供自己的比较函数,如下所示:

// Example array
$array = array(
    3 => array(
        0 => 6,
        1 => array(
            0 => array(
                'optionID' => 16,
                'isCorrect' => 0
            ),
            1 => array(
                'optionID' => 14,
                'isCorrect' => 1
            ),
            2 => array(
                'optionID' => 15,
                'isCorrect' => 0
            ),
            3 => array(
                'optionID' => 17,
                'isCorrect' => 0
            ),
        )
    ),
    7 => array(
        0 => 6,
        1 => array(
            0 => array(
                'optionID' => 16,
                'isCorrect' => 0
            ),
            1 => array(
                'optionID' => 15,
                'isCorrect' => 0
            ),
            2 => array(
                'optionID' => 17,
                'isCorrect' => 0
            ),
            3 => array(
                'optionID' => 14,
                'isCorrect' => 1
            ),
        )
    )
);

// You can supply parts of an array to uasort()
// uasort() will modify your array but keep your keys.
uasort($array[3][2], 'sort_by_optionid');
uasort($array[7][3], 'sort_by_optionid');

function sort_by_optionid($a, $b) {
    if ($a['optionID'] === $b['optionID']) {
        return 0;
    } else if ($a['optionID'] > $b['optionID']) {
        return 1;
    } else {
        return -1;
    }
}
// Done. 

现在保留了键,您可以轻松地排列_map()以查找重复项,然后根据键再次排序回原始状态。例如,使用

阵列(map-serialize是一种非常粗糙的阵列重复数据消除方法。您应该使用类似以下内容:

$dupeIds = [];
$array = array_filter($array, function ($item) use (&$dupeIds) {
    $keep = !isset($dupeIds[$item[0]]);
    $dupeIds[$item[0]] = true;
    return $keep;
});

这是一个非常聪明的解决方案+1+1. 当然,它会返回那些应该消失的,以获得其余的:$remove=!isset($dupeIds[$item[0]])@用户3385195对,修复了那个bug。