保留第二个索引上具有最低值的唯一节点

时间:2018-05-31 12:47:56

标签: php arrays sorting

我正在研究PHP中的多维数组。如何从索引1上具有最低值的嵌套数组的0索引中选择唯一值?

以下是我的示例数据数组

$data = array (
    array(1, 9),
    array(1, 3),
    array(1, 5),
    array(9, 2),
    array(9, 7),
);

我试图得到以下数组

$result = array (
    array(1, 3),
    array(9, 2),
);

4 个答案:

答案 0 :(得分:0)

$data = array (
array(1, 9),
array(1, 3),
array(1, 5),
array(9, 2),
array(9, 7),
);

$result = [];
$lowest0 = null;
$lowest1 = null;

foreach($data as $row){
    if($lowest0 === null || $row[0] < $lowest0[0] || ($row[0] === $lowest0[0] && $row[1] < $lowest0[1]))
    {
        $lowest0 = $row;
    }

    if($lowest1 === null || $row[1] < $lowest1[1] || ($row[1] === $lowest1[1] && $row[0] < $lowest0[0]))
    {
        $lowest1 = $row;
    }
}

$result = [$lowest0,$lowest1];

var_dump($result);

答案 1 :(得分:0)

执行此操作的一种方法是循环数组,使用数组的索引并比较第二个值。如果存储的第二个值大于新值,则覆盖它。

$data = array (
    array(1, 9),
    array(1, 3),
    array(1, 5),
    array(9, 2),
    array(9, 7),
);

$result = [];
foreach ($data as $d) {
    if (!isset($result[$d[0]])) {
        $result[$d[0]] = $d;
        continue;
    }
    if ($result[$d[0]][1] > $d[1]) {
        $result[$d[0]] = $d;
    }
}

print_r($result);

Demo

答案 2 :(得分:0)

短而脏:

$data = array (
    array(1, 9),
    array(1, 3),
    array(1, 5),
    array(9, 2),
    array(9, 7),
);

foreach ($data as $row) {
 ($row[1] < ($uniq[$row[0]][1] ?? INF)) and $uniq[$row[0]] = $row;
}

var_dump($uniq);

如果从0重新索引对您很重要,则通过array_values传递结果数组

答案 3 :(得分:0)

这就像泥巴一样清晰,但我把它作为一个例子,它没有循环工作。

<击>

简而言之,我使用min和array_intersect(_key)来查找列中最小值的位置(使用array_column)。

//split out the two columns
$col0 = array_column($data, 0);
$col1 = array_column($data, 1);

// find minimum value in each
$min0 = min($col0);
$min1 = min($col1);

// find what keys this minimum value is in of each array
$mincol0 = array_intersect($col0, [$min0]);
$mincol1 = array_intersect($col1, [$min1]);

// use the previous and compare with minimum value of the other column
$result[] = $data[array_keys(array_intersect_key($col1, $mincol0),min(array_intersect_key($col1, $mincol0)))[0]];
$result[] = $data[array_keys(array_intersect_key($col0, $mincol1),min(array_intersect_key($col0, $mincol1)))[0]];

Var_dump($result);

<击> https://3v4l.org/dgbDK

因为我显然误解了这个问题 这是另一个答案,仍然不需要循环完整的数组。那只是浪费时间。

仅循环唯一的第0列值,并使用array_intersect和array_intersect_key在第1列中查找minmum值。

$col0 = array_column($data, 0);

foreach(array_unique($col0) as $item){
    $intersect = array_intersect($col0, [$item]);
    $res[] = min(array_intersect_key($data, $intersect));

}

var_dump($res);

https://3v4l.org/3UPQh