0

1次元配列の場合、array_unique一意のエントリを取得するために使用できます。しかし、2次元配列を操作するには、どの関数を使用する必要がありますか?例えば:

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に基づいて一意でない行を削除する必要があります。その結果、最初の2つのエントリを取得し、3番目のエントリを削除する必要があります。これを行う方法?

4

4 に答える 4

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);
于 2012-07-25T19:00:48.290 に答える
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));
于 2012-07-25T18:01:12.353 に答える
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));
于 2012-07-25T20:08:56.073 に答える
0

共有する効率的なテクニックがいくつかあります。(デモ

結果の順序を気にしない場合、このワンライナーは(列の値に基づいて)最初の一意の行を保持します。

コード:

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));

一時キーを使用すると、phpは値よりもキーの検索が高速であるため、isset()より効率的です。array_search()

于 2019-12-24T04:02:57.173 に答える