对于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列删除非唯一行。因此,我应该获得前两个条目,而第三个条目应该被删除。怎么做?
答案 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搜索键的速度比值更快。