array_unique用于多维数组

时间:2012-07-25 13:31:19

标签: php arrays

对于one-dim数组,我可以使用array_unique来获取唯一条目。但是应该使用哪个函数来处理双暗阵列? 例如:

Array[0][0] = '123'; Array[0][1] = 'aaa';
Array[1][0] = '124'; Array[1][1] = 'aaa';
Array[2][0] = '124'; Array[2][1] = 'aaa';

在上面的示例中,我需要根据第0列删除非唯一行。因此,我应该获得前两个条目,而第三个条目应该被删除。怎么做?

4 个答案:

答案 0 :(得分:2)

试试这个:

$matrix = array(
    0 => array(0 => '123', 1 => 'aaa'),
    1 => array(0 => '124', 1 => 'aaa'),
    2 => array(0 => '124', 1 => 'aaa'),
    3 => array(0 => '124', 1 => 'aaa'),
    4 => array(0 => '114', 1 => 'aaa'),
    5 => array(0 => '124', 1 => 'aaa'),
    6 => array(0 => '124', 1 => 'aaa'),
    7 => array(0 => '124', 1 => 'aaa'),
    8 => array(0 => '124', 1 => 'aaa'),
    9 => array(0 => '124', 1 => 'baa'),
    10 => array(0 => '123', 1 => 'baa'),
    11 => array(0 => '1241', 1 => 'baa'),
);


$d = array();
foreach ($matrix AS $key => $value) {
    if (!array_search($value, $d)) {
        $d[] = $matrix[$key];
    }
}

var_dump($d);

答案 1 :(得分:1)

试试这个......

function unique_matrix($matrix) {
    $matrixAux = $matrix;

    foreach($matrix as $key => $subMatrix) {
        unset($matrixAux[$key]);

        foreach($matrixAux as $subMatrixAux) {
            if($subMatrix === $subMatrixAux) {
            // Or this
            //if($subMatrix[0] === $subMatrixAux[0]) {
                unset($matrix[$key]);
            }
        }
    }

    return $matrix;
}

$matrix = array(
    0 => array(0 => '123', 1 => 'aaa'),
    1 => array(0 => '124', 1 => 'aaa'),
    2 => array(0 => '124', 1 => 'aaa'),
);

var_dump(unique_matrix($matrix));

答案 2 :(得分:1)

如果你的数组总是为第1列返回相同的值,那么当重复第0列时,你应该在array_unique上使用标志SORT_REGULAR,如下所示:

$matrix = array(
    array(0 => '123', 1 => 'aaa'),
    array(0 => '124', 1 => 'aaa'),
    array(0 => '124', 1 => 'aaa'),
);

var_dump(array_unique($matrix, SORT_REGULAR));

答案 3 :(得分:0)

我有两种有效的技术可以分享。 (Demo

如果您不关心结果的顺序,那么这种单行将保留前唯一行(基于列值)。

代码:

var_export(array_reverse(array_column(array_reverse($array), null, 0)));

这将反转输入并覆盖具有重复的第一列值的先前找到的行-因为在同一数组级别不允许重复键。

或者,如果您想保留原始的行顺序,则将提供相同的结果而无需反转。

代码:

$result = [];
foreach ($array as $row) {
    if (!isset($result[$row[0]])) {
        $result[$row[0]] = $row;
    }
}

var_export(array_values($result));

使用临时键和isset()array_search()更有效,因为php搜索键的速度比值更快。