问题
我有一个类似于下面的多维数组。我想要实现的是一种从数组中查找和检索具有最高“Total”值的方法,现在我知道有一个名为max
的函数,但是它不适用于多维数组,如此
我想到的是创建一个foreach循环并构建一个只包含总数的新数组,然后使用max
找到最大值,这将起作用,唯一的问题就是检索与该最大值相关的其余数据。我不确定这是最有效的方式。
有什么想法吗?
Array
(
[0] => Array
(
[Key1] => Key1
[Total] => 13
)
[1] => Array
(
[Key2] => Key2
[Total] => 117
)
[2] => Array
(
[Key3] => Key3
[Total] => 39
)
)
答案 0 :(得分:42)
从PHP 5.5开始,您可以使用array_column
获取特定键的值数组,并将其最大化。
max(array_column($array, 'Total'))
答案 1 :(得分:23)
只需执行simple loop
并比较值或使用array_reduce
$data = array_reduce($data, function ($a, $b) {
return @$a['Total'] > $b['Total'] ? $a : $b ;
});
print_r($data);
答案 2 :(得分:10)
这是如此基本的算法。
$max = -9999999; //will hold max val
$found_item = null; //will hold item with max val;
foreach($arr as $k=>$v)
{
if($v['Total']>$max)
{
$max = $v['Total'];
$found_item = $v;
}
}
echo "max value is $max";
print_r($found_item);
答案 3 :(得分:6)
我知道这个问题已经过时了,但我提供了以下答案,以回应标记为重复后指出的另一个问题。这是我在目前的答案中没有提到的另一种选择。
我知道有一个名为max的函数,但是它不能像这样使用多维数组。
您可以使用array_column
解决这个问题,这样可以轻松获得最大值:
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.0/jquery.min.js"></script>
<ul class="menu">
<li>
<a href="#">Everyday</a>
<ul class="sub-menu">
<li><a href="#">Sat</a></li>
<li><a href="#">Sun</a></li>
<li><a href="#">Mon</a></li>
<li><a href="#">Tue</a></li>
<li><a href="#">Wed</a></li>
<li><a href="#">Thu</a></li>
<li><a href="#">Fri</a></li>
</ul>
</li>
</ul>
获取关联键是一个有点棘手的地方,考虑到你可能真的想要多个键(如果$arr = [['message_id' => 1,
'points' => 3],
['message_id' => 2,
'points' => 2],
['message_id' => 3,
'points' => 2]];
// max value
$max = max(array_column($arr, 'points'));
匹配多个值)。您可以使用array_map
中的匿名函数执行此操作,并使用array_filter
删除$max
值:
null
<强>输出:强>
// keys of max value
$keys = array_filter(array_map(function ($arr) use ($max) {
return $arr['points'] == $max ? $arr['message_id'] : null;
}, $arr));
如果您最终使用多个键但只对找到的第一个匹配感兴趣,那么只需引用array(1) {
[0]=>
int(1)
}
。
答案 4 :(得分:2)
另一个简单的方法是
$max = array_map( function( $arr ) {
global $last;
return (int)( ( $arr["Total"] > $last ) ? $arr["Total"] : $last );
}, $array );
print_r( max( $max ) );
答案 5 :(得分:1)
你可以使用php usort功能: http://php.net/manual/en/function.usort.php
这里给出了一个很好的例子:
<?php
function cmp($a, $b)
{
return strcmp($a["fruit"], $b["fruit"]);
}
$fruits[0]["fruit"] = "lemons";
$fruits[1]["fruit"] = "apples";
$fruits[2]["fruit"] = "grapes";
usort($fruits, "cmp");
while (list($key, $value) = each($fruits)) {
echo "\$fruits[$key]: " . $value["fruit"] . "\n";
}
?>
因此它会将最大值排序到最后一个数组索引。
输出:
$fruits[0]: apples
$fruits[1]: grapes
$fruits[2]: lemons
此示例在上述链接
中给出答案 6 :(得分:1)
可以使用array_walk完成(如果需要,可以使用array_walk_recursive)
$ arr是您要在
中搜索的数组$largestElement = null;
array_walk($arr, function(&$item, $key) use (&$largestElement) {
if (!is_array($largestElement) || $largestElement["Total"] < $item["Total"]) {
$largestElement = $item;
}
});
答案 7 :(得分:1)
<?php
$myarray = array(
0 => array(
'Key1' => 'Key1',
'Total' => 13,
),
1 => array(
'Key2' => 'Key2',
'Total' => 117,
),
2 => array(
'Key2' => 'Key3',
'Total' => 39,
),
);
$out = array();
foreach ($myarray as $item) {
$out[] = $item['Total'];
}
echo max($out); //117
unset($out, $item);
答案 8 :(得分:0)
array_reduce接受第三个“初始”参数。使用它来避免使用“ @”错误抑制的错误做法:
$data = array_reduce($data, function ($a, $b) {
return $a['Total'] > $b['Total'] ? $a : $b ;
},['Total' => 0]);
print_r($data);
PHP 7.4
$data = array_reduce($data, fn(a,b) => $a['Total'] > $b['Total'] ? $a : $b, ['Total' => 0]);