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

Php 在第二个索引上保留具有最低值的唯一节点,php,arrays,sorting,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), ); $data=array( 阵列(1,

我正在用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),
);
$data=array(
阵列(1,9),
阵列(1,3),
阵列(1,5),
阵列(9,2),
阵列(9,7),
);
$result=[];
$lowest0=null;
$lowest1=null;
foreach($行数据){
如果($lowest0===null | |$$row[0]<$lowest0[0]| |($row[0]===$lowest0[0]&&&$row[1]<$lowest0[1]))
{
$lowest0=$row;
}
如果($lowest1===null | |$$row[1]<$lowest1[1]| |($row[1]===$lowest1[1]&&&$row[0]<$lowest0[0]))
{
$lowest1=$row;
}
}
$result=[$lowest0,$lowest1];
var_dump($结果);

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

$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);
又短又脏:

$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);
$data=array(
阵列(1,9),
阵列(1,3),
阵列(1,5),
阵列(9,2),
阵列(9,7),
);
foreach($行数据){
($row[1]<($uniq[$row[0]]][1]?INF))和$uniq[$row[0]]=$row;
}
var_dump($uniq);
如果从0重新索引对您很重要,请将结果数组传递给
array\u值

这一点非常清楚,但我举了一个例子,它可以在不循环的情况下工作

简而言之,我使用min和array_intersect(_键)查找最小值在列中的位置(使用array_列)

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

仅循环唯一的列0值,并使用array_intersect和array_intersect_键查找列1中的最小值

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

重复您之前的问题,是的,我试图重写以使其简单明了。已经要求删除我的旧问题。那么你至少有办法或想法吗?(不喜欢这里的“我需要,你创造”哲学…)这些数组在哪些方面比其他数组更独特?这将返回[1,9],而不是OP想要的[1,3]。太棒了!我的方法非常相似。我不会写代码。您能解释一下为什么在这里使用isset()吗。非常感谢!!!首先检查该索引上是否已有内容。如果没有,则将其设置为第一个数组,并使用
继续
再次循环。下次索引上有东西时,你可以检索它。天才!现在我在嘲笑我的代码。我在
foreach
循环中使用了一个自定义函数,其中包含一些不可理解的逻辑。我非常感谢你的帮助。奇怪的是,当我有一个大的阵列时,这种方法仍然有效吗?@AZee循环解决方案会随着阵列的增大而变慢。非循环解决方案通常在较小的阵列上速度较慢,但通常随着阵列大小的增加而加快。@第四鸟:是的,您是正确的。我需要索引0中的唯一值,该索引在索引1上具有最低值。您的代码就像一个魔咒。黑魔法:-)在唯一列表中添加行或覆盖旧行,如果它不存在,或者如果行中的第二列值小于列表中的值,则使用短路和运算符,这有助于避免if条件-如果您厌倦了许多if-ELSEIF-ELSE地狱:-)从中压缩另一个字节使用新的空合并运算符和无穷大常量编写代码。哇!!你能推荐一本好书吗?我以前没有听到短路和操作员的声音。你的代码很有趣。是的,如果埃尔塞夫·埃尔塞斯很累,看起来很无聊的话。我通常用开关。我很想了解更多关于你们的方法。Switch很好,几乎是状态机不可替代的工具。而且,与许多信念相反,-<代码> Goto 非常有用——考虑在一百页的源代码中终止10个服务器之间的分布式事务,而不会丢失。“short-circuit”只是指语句的一部分没有被计算,因为它不需要-
0>1和printf('cool')-将不调用printf,因为第一个条件为FALSE。就这么简单。多编码-少阅读-这是我对培训技能的建议:-)谢谢你。现在我明白了:-)@AZee更新了答案我喜欢你的方法,而且效果很好。非常感谢你。
//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);
$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);