如何找到数组中最小的数并返回该数组的主要索引?

3
我有一个如下所示的数组。我想找到“diff”索引中数字最小的数组。因此,在这种情况下,我希望返回数组[7]。我只需要数组编号(即7),不需要任何其他信息。
我知道可以使用array_column轻松找到最低数字,但如何同时返回7的整个数组索引?
[1] => Array
        (
            [qb] => 7
            [rb] => 58
            [wr] => 91
            [te] => 3
            [def] => 11
            [diff] => 136
        )

    [2] => Array
        (
            [qb] => 21
            [rb] => 96
            [wr] => 102
            [te] => 48
            [def] => 15
            [diff] => 240
        )

    [3] => Array
        (
            [qb] => 23
            [rb] => 86
            [wr] => 216
            [te] => 6
            [def] => 32
            [diff] => 287
        )

    [4] => Array
        (
            [qb] => 30
            [rb] => 51
            [wr] => 200
            [te] => 14
            [def] => 17
            [diff] => 266
        )

    [5] => Array
        (
            [qb] => 17
            [rb] => 118
            [wr] => 273
            [te] => 14
            [def] => 30
            [diff] => 380
        )

    [6] => Array
        (
            [qb] => 10
            [rb] => 112
            [wr] => 142
            [te] => 16
            [def] => 4
            [diff] => 264
        )

    [7] => Array
        (
            [qb] => 2
            [rb] => 50
            [wr] => 135
            [te] => 9
            [def] => 20
            [diff] => 104
        )

    [8] => Array
        (
            [qb] => 16
            [rb] => 68
            [wr] => 141
            [te] => 12
            [def] => 1
            [diff] => 224
        )

你尝试过循环和比较吗? - Franz Gleichmann
6个回答

5

您提到可以使用array_column和min()。
然后使用array_search来查找最小值所在的位置。

//Since the array starts with key 1 then use array_values to reset the array first.
$array = array_values($array);
$diff = array_column($array, "diff");
$min = min($diff);
$key = array_search($min, $diff);

$result = $array[$key];

示例代码:
https://3v4l.org/ci70K


@MorganFreeFarm 谢谢!我一直对 PHP 函数的顺序感到困惑,因为它不够一致。 - Andreas
我之前没有看过你的代码。我们的答案非常相似。我的代码在后台进行搜索,而你的代码在“前台”循环中进行。但它们是相同的代码。 - Andreas
所以我的实际数组中有32个数组。第20个数组具有最低的“diff”值,但您的代码返回“19”。我可能错过了一些东西,也许是由于数组从0开始计数?那一定是这样解释的。 - user3304303
好的,我只是期望它给我字面上的主键而不是数组中的位置。但我可以将结果加1 :) - user3304303
在代码中添加了array_values以处理以0以外的键开始的数组。 - Andreas
显示剩余4条评论

3

这里有个例子,我试图在不使用循环的情况下实现解决方案,但是并没有成功:

$diffs = array_column($array, 'diff'); // get all diffs
$key = min($diffs); // takes the smallest
$result = '';
foreach ($array as $subarray) {
    if ($subarray['diff'] == $key) { 
        $result = $subarray;
    }
}
var_dump($result);

$array是你的数组。

返回值:

array(6) {
  ["qb"]=>
  int(2)
  ["rb"]=>
  int(50)
  ["wr"]=>
  int(135)
  ["te"]=>
  int(9)
  ["def"]=>
  int(20)
  ["diff"]=>
  int(104)
}

0
一种方法是使用 uasort 来维护索引关联性,然后使用 key 返回当前数组位置的索引。
uasort($arrays, function ($a, $b) {
    return $a["diff"] > $b["diff"];
});

echo key($arrays); // 7

Php演示


感谢回复。您的PHP演示似乎有效,但我对某些事情感到困惑。如果$diff最初设置为0,那么任何$array['diff']怎么可能小于0(因为所有的“diff”索引都远高于0)? - user3304303

0

如果您有多个最小的“diff”,可能会遇到问题。

以下循环遍历数组并构建原始键和差异值之间的映射。

然后使用min查找最低的差异值。

然后我们搜索与该值对应的键。并通过这些键过滤原始数组。

<?php

$data =
[
    'five' => [
        'diff'=>5
    ],
    'three' => [
        'diff'=>3
    ],
    'seven' => [
        'diff'=>3
    ]
];

foreach($data as $key => $value)
    $diffs[$key] = $value['diff'];

$min_diff_keys = array_keys($diffs, min($diffs));

$output = array_intersect_key($data, array_flip($min_diff_keys));
var_export($output);

输出:

array (
  'three' => 
  array (
    'diff' => 3,
  ),
  'seven' => 
  array (
    'diff' => 3,
  ),
)

如果您确定diff只有一个唯一的最小值,您可以在diff映射($diffs)上使用array_search而不是array_keys,以获取相关键。然后使用该索引来定位所需的数组。

0

另一种解决方案是使用锅(PHP 7.3+)。我不知道它有多高效。

$diffs = array_column($array, "diff");
// lowest first sort (asort maintains correlation with original indices) 
asort($diffs);  
$lowest_dif_key = array_key_first($diffs) + 1;  // requires PHP 7.3
//  as array indices start at zero we have to add one for the correct "array key"    

0
这个问题应该有一个足够灵活的答案,能够处理最小差异的“平局”,并且计算复杂度为n。没有必要进行多重循环或多次迭代函数调用;排序技术是平局无视的。
一个带有条件块的单个foreach循环简单、高效、易于阅读。
代码:(演示)
$result = ['lowest' => null, 'indexes' => []];
foreach ($array as $index => $row) {
    if ($result['lowest'] === null || $row['diff'] < $result['lowest']) {
        $result['lowest'] = $row['diff'];            // overwrite
        $result['indexes'] = [$index];               // overwrite
    } elseif ($row['diff'] == $result['lowest']) {
        $result['indexes'][] = $index;               // push
    }
}
echo "First level index(es) with the lowest diff: " . implode(', ', $result['indexes']) . "\n";
echo "Lowest occurring diff in data set: " . $result['lowest'];

输出:

First level index(es) with the lowest diff: 7
Lowest occurring diff in data set: 104

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接