【问题标题】:Find array element with greatest or smallest sub-array element value查找具有最大或最小子数组元素值的数组元素
【发布时间】:2017-01-17 19:55:33
【问题描述】:

以下数组的元素1代表x值最大的元素,元素2代表x元素最小的元素。

不用PHP代码循环遍历每个数组,如何确定x最大和最小元素的索引?

$array = [
    ['x'=>5,'y'=>3],
    ['x'=>9,'y'=>3],
    ['x'=>3,'y'=>3],
    ['x'=>7,'y'=>3]
];

【问题讨论】:

  • 必须循环每个元素,如果有比你发现的更大的值,你怎么知道?!
  • 仅仅因为您在代码中没有看到它并不意味着array_column() 不会循环遍历整个数组,因为它确实如此。你可以使用一个简单的 foreach 循环,然后你只会在数组上循环一次,而不是像 array_column() 那样循环两次。
  • 更准确地说,如果你使用array_column(),你不仅要遍历数组一次来获取列,还需要使用min()max(),这也需要循环整个数组。因此,您总共遍历数组 3 次,只是因为您不想在代码中看到“循环”。您可以使用一个简单的 foreach 循环并在一个循环中完成所有操作!
  • 通过使用限制:Without looping over each - 你的意思是:1) 不要使用foreach 循环语句 2) 使用一些不比较相邻条目值的指令? 1) 满足使用 'array_*' 函数。 2) 不可能使用任何使用标准 CPU 和内存的计算机。说清楚 - 所有传统计算机总是循环遍历数据。
  • @RyanVincent 我应该说“不使用 PHP 代码循环”。

标签: php arrays


【解决方案1】:

提取x 列并计算它:

$x = array_column($array, 'x');
$min = min($x);
$max = max($x);

或者,正如 JustOnUnderMillions 指出的那样:

list($min, $max) = [min($x=array_column($array, 'x')), max($x)];

要获取包含该值的数组的索引,只需使用array_search()。如果有多个相同的值,它将返回第一个键:

$x = array_column($array, 'x');
$min = array_search(min($x), $x, true);
$max = array_search(max($x), $x, true);

array_column() 需要 PHP >= 5.5.0 或使用 PHP Implementation of array_column()

【讨论】:

  • 请使用list() 最终获得单线;-)
  • 没有array_column() 的答案不是正确的答案吗? :P 您还可以包含一个简单的 foreach 循环,使用该循环 OP 只需迭代数组一次。
  • 实际上,我正在尝试获取元素的索引(即 1 表示最大,2 表示最小),而不是值。
  • @Rizier123 当然,array_mapfunction($a)use(&$min,&max){} 也可以。也许这项任务有点简单。 :)
  • @user1032531 哎呀,但没人看到这样的!为此,您需要另一个代码 sn-p。
猜你喜欢
  • 1970-01-01
  • 2014-07-21
  • 2019-02-24
  • 2013-12-15
  • 1970-01-01
  • 2010-12-12
  • 2018-10-17
  • 2011-11-27
相关资源
最近更新 更多