情况:我有一个包含可变数量元素的多维数组。 e.g。
array(N) {
0 => array(3) { ... },
1 => array(8) { ... },
2 => array(1) { ... },
...
M => array(12) { ... },
...
N-1 => array(7) { ... }
}
我想找到这个子数组中的最大元素数(在上面的例子中,它将是12)。一个简单的解决方案是O(N)线性搜索。
<?php
function max_length($2d_array) {
$max = 0;
foreach($2d_array as $child) {
if(count($child) > $max) {
$max = count($child);
}
}
return $max;
}
然而,我不禁想知道是否有一些聪明的技巧来优化这种查找。所以我的问题是两个部分(虽然任何一个部分的答案都可以解决它):
答案 0 :(得分:3)
不确定性能,但我认为以下内容应该有效:
$count = array_map('count', $input_arr);
$min = array_keys($count , max($count))[0];
$largest_arr = $input_arr[$min];
甚至:
$counts = array_map('count', $input_arr);
$key = array_flip($counts)[max($counts)];
$largest_arr = $input_arr[$key];
答案 1 :(得分:2)
1)按照元素大小对多维数组进行排序:
选择以O(n logn)最差情况运行的算法,例如堆排序(comparison of sorting algorithms)。
2)选择最后一个元素。
这在O(1)
因此,如果您自己实现排序算法并假设获取数组长度为O(1)而不是线性(每次询问长度时都不计算),则可以在O(n logn)中执行此操作
我无法评论任何为你做这件事的PHP方法,因为我没有使用它。
答案 2 :(得分:2)
您可以使用:https://www.php.net/manual/ro/function.max.php
$test = array(
array('G', 'M', 2, 2),
array(1, 2222, 3)
);
$arr = max($test);
//输出->
array(4) {
[0]=>
string(1) "G"
[1]=>
string(1) "M"
[2]=>
int(2)
[3]=>
int(2)
}
答案 3 :(得分:1)
只是为了好玩:
array_multisort($result = array_map('count', $array), SORT_DESC);
echo $result[0];
答案 4 :(得分:0)
$max = 0;
foreach($array as $obj)
{
if($obj->dnum > $max)
{
$max = $obj->dnum;
}
}
或
$numbers = array();
foreach($array as $obj)
{
$numbers[] = $obj->dnum;
}
$max = max($numbers);
或......
在该文章中阅读更多内容 - Get the maximum value from an element in a multidimensional array?或How to find the largest array from a multi dimensional array
答案 5 :(得分:0)
How about this:
function accmp(&$a, &$b) { return count($a)<count($b)?-1:1; }
$arraylist=array(array(1,2),array(1,2,3),array(1),array(1,2,3,4,5,6),array(1,2,3,4),array(2,3,4));
echo 'original arraylist:<br>'; print_r($arraylist); echo '<br>';
usort($arraylist,'accmp');
echo 'largest array::<br>'; print_r(end($arraylist)); echo '<br>';
echo 'largest size = '.count(end($arraylist))
Just sort array-element in arraylist in ascending order of count(array-element) and take last element.