【问题标题】:Return array_column from an associative array when a search a min value搜索最小值时从关联数组返回 array_column
【发布时间】:2020-09-22 19:06:39
【问题描述】:

我有一个循环来填充 $positions 数组,如下所示:

array_push($positions, ["id" => $p->id, "distance"=> $distance, "date" => $p->date]);

然后我找到了这样的最小键“距离”:

$min = min(array_column($positions,'distance'));

现在我想从建立的“距离”中获取通讯员“id”。

我该怎么做?

【问题讨论】:

  • 提供一个功能性答案会更容易,您提供了一个具有$positions 值的实际数组。
  • @Bruno 您应该在 during 推送循环中使用 Berto 的技术,这样您就可以减少脚本中执行的循环数。

标签: php arrays min


【解决方案1】:

未经测试:

$distances = array_column($positions,'distance', 'id');
$min = min($distances);
$id = array_search($min, $distances);

这会获取距离并创建一个以 id 值作为键的新数组。然后它获取最小值并使用它来搜索与其对应的键。

如果您有多个具有相同最小值的项目,我不确定结果会是什么,因此您应该对其进行测试。但是,如果您想要所有 ID 的最小值,您可以使用 array_keys() 和可选的 search_value 参数。

$ids = array_keys($distances, $min);

【讨论】:

    【解决方案2】:

    考虑使用自定义算法(其计算复杂度为 n,而使用您的方式是 2n,因此慢 2 倍):

    $positions= [...];
    $min = $positions[0]['distance'];
    $elements = [0];
    foreach ($positions as $pos) {
       if ($pos["distance"] < $min) {
           $elements = [$pos];
           $min = $pos["distance"];
       } elseif ($pos["distance"] == $min) {
           $elements[] = $pos;
       }
    }
    

    但如果您严格需要ids,请告诉我,我将发布其他算法。

    【讨论】:

    • 这可能是页面上表现最好的,因为它只需要迭代传入的数据一次:array_column()(迭代),min()(迭代),然后array_search()/ array_keys()(迭代)。另一方面,如果代码简洁更重要,或者如果您发现函数式编程的声明式语法更受欢迎,请使用 John 的建议。
    • 请不要在 PHP 中使用 else if(两个词)——这违反了 PSR 准则,因为它被呈现为 } else { if (...) {}}`但在两个控制结构之间缺少推荐的花括号。 php-fig.org/psr/psr-12
    • @mickmackusa 哇,每天都有新的东西,谢谢,编辑
    【解决方案3】:

    您也可以按id 进行索引,升序排序并获得第一个键:

    $distances = array_column($positions, 'distance', 'id');
    asort($distances);
    $id = key($distances);
    

    【讨论】:

      猜你喜欢
      • 2021-04-10
      • 1970-01-01
      • 2012-09-04
      • 2023-03-06
      • 2020-09-04
      • 2020-11-25
      • 1970-01-01
      • 2021-05-29
      • 1970-01-01
      相关资源
      最近更新 更多