Мне нравится ответ @ Маттео-Tassinari и @evilive гораздо больше и хотел сам предложить это.Но так как вопрос о Efficency подошел, вот это решение, используя только одну петлю, и, следовательно, имеет линейную временную сложность:
<?php
$max = ~PHP_INT_MAX;
$result = [];
foreach($age as $key => $value) {
if($value > $max) {
$result = [ $key => $value ];
$max = $value;
}
if($value == $max) {
$result[$key] = $value;
}
}
var_dump($result);
И существует другое решение, которое использует bucket sort:
function bucket($ages) {
$buckets = [];
foreach($ages as $key => $value) {
$buckets[$value][] = $key;
}
return $buckets[max(array_keys($buckets))];
}
Что касается discusson о Peformance и масштабируемости, я написал небольшой бенчмарк сценария для четырех видов предлагаемых решений (петель, sort, filter, ведра):
<?php
function loop($ages) {
$max = 0;
$result = [];
foreach($ages as $key => $value) {
if($value > $max) {
$result = [ $key => $value ];
$max = $value;
}
if($value == $max) {
$result[$key] = $value;
}
}
return array_keys($result);
}
function filter($ages) {
$max = max($ages);
$new = array_filter($ages, function ($age) use ($max) { return $age == $max; });
return array_keys($new);
}
function bucket($ages) {
$buckets = [];
foreach($ages as $key => $value) {
$buckets[$value][] = $key;
}
return $buckets[max(array_keys($buckets))];
}
for($n = 2; $n < 10000000; $n*=2) {
$ages = [];
for($i = 0; $i < $n; $i++) {
$ages['name_'.$i] = rand(0,100);
}
$start = microtime(true);
echo $n.';';
loop($ages);
echo (microtime(true) - $start).';';
$start = microtime(true);
arsort($ages);
echo (microtime(true) - $start).';';
$start = microtime(true);
filter($ages);
echo (microtime(true) - $start).';';
bucket($ages);
echo (microtime(true) - $start).';';
echo PHP_EOL;
}
Limited Live Test
Пожалуйста перепроверить, если это право: Использование PHP-5.6.15 в командной строке, мои тайминги выглядеть примерно так:
elements;loop;sort;filter;bucket
...
4096;0.001507;0.009868;0.01211;0.01453;
8192;0.003704;0.002483;0.02488;0.03035;
16384;0.006660;0.01010;0.05396;0.06723;
32768;0.01417;0.01271;0.09163;0.1163;
...
1048576;0.4227;0.9791;2.983;3.943;
2097152;0.8572;2.320;6.064;8.020;
4194304;1.787;4.981;11.90;16.04;
8388608;3.892;10.84;24.76;33.31;
Для небольшого числа элементов, разница между методы не очень большие, но, как вы можете видеть, для наибольшего значения метод loop
в два раза быстрее, чем sort
, в 8 раз быстрее, чем filter
и в одиннадцать раз быстрее, чем bucket
. Так что если ваш массив огромный, вы должны использовать loop
.
просто для того, чтобы прояснить ситуацию и избежать путаницы. у вас есть многомерный массив ассоциативных массивов. Объект будет чем-то вроде класса. –
Спасибо за tha @ iam-decoder – uno
Вы не должны добавлять значения interget как строку, а как целое: 'array (" Peter "=> 35)'. Целые числа быстрее, чем строки, используйте их там, где вы можете :) – Martijn