我正在研究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),
);
答案 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);
答案 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);