<?php
$myarray = array(0 => 15, 1 => 2, 2 = > 10, 3 => 22, 4 => 7);
?>
PHP - вопрос по массивам.
нужно помощь по работе с массивами. Нужно из массива выбрать самое большое значиние.
[CENTER][SIZE="5"]Пример:[/SIZE][/CENTER]
Код:
в этом массиве - самое больщое значение имеет: $myarray[3]; вот мне и нужно вытащить имееено порядковый номер в массиве, тут он равен: 3
у кого какие идеи будут?
Цитата:
у кого какие идеи будут?
А какие могут быть идеи для такой элементарнейшей задачи? Пройтись циклом по всем элементам и найти большее, сохранив его индекс. Две строчки
asort\sort используют, если не ошибаюсь, пузырьковый метод.
Т.е. массив перебирается много раз.
А в цикле foreach мы просто делаем что-то вроде if($val>$max) {$max=$val; } т.е. проходимся по массиву ровно один раз сравнивая с максимальным, на текущую итерацию, значением.
Тестил у себя... Разница в производительности небольшая... на массив в 100000 значений разница в 0.16с
Вопрос элементарный до безобразия, зачем такие бурные обсуждения разводить? :) Любая сортировка модифицирует сам массив, поэтому она не пригодна для задачи в принципе. А копировать массив в промежуточный только для того, чтобы найти индекс максимального элемента, - это, извините, порнография.
Цитата: Kesano
Тестил у себя... Разница в производительности небольшая... на массив в 100000 значений разница в 0.16с
И как оно? Стоит-ли эта разница стОлькой писанины? ))))
max и array_keys :)
Самое быстрое (и правильное) решение -
[quote=http://stackoverflow.com/questions/1461348/return-index-of-highest-value-in-an-array]
[/quote]
В php есть фу-я
Самое быстрое (и правильное) решение -
[quote=http://stackoverflow.com/questions/1461348/return-index-of-highest-value-in-an-array]
Код:
$maxs=array_keys($array, max($array));
[/quote]
arrjj, не согласен. Ваш вариант проходится по массиву два раза - один раз при вызове max(), а второй раз - при вызове array_keys(). А можно пройтись один раз (правда, это при условии, что максимальное значение в массиве не повторяется).
А array_keys + max очень быстро отрабатывает, быстрее простого прохода.
Код:
$array=array();
for($i=0;$i<1000000;$i++)
$array[]=rand();// $array[]=$i;
echo microtime().'<br>';
$b=array_keys($array, max($array));
echo microtime().'<br>';
$max=$array[0];
$maxindex=0;
for($i=0;$i<1000000;$i++)
if($array[$i]>$max)
{
$max=$array[$i];
$maxindex=$i;
}
echo microtime().'<br>';
for($i=0;$i<1000000;$i++)
$array[]=rand();// $array[]=$i;
echo microtime().'<br>';
$b=array_keys($array, max($array));
echo microtime().'<br>';
$max=$array[0];
$maxindex=0;
for($i=0;$i<1000000;$i++)
if($array[$i]>$max)
{
$max=$array[$i];
$maxindex=$i;
}
echo microtime().'<br>';
Cкорость работы array_keys+max не меняется в зависимости от заполнения массива, а цикл по массиву идёт в среднем в два раза медленней при $array[]=$i (худший случай) чем по рендомному массиву.
[QUOTE=arrjj]
Cкорость работы array_keys+max не меняется в зависимости от заполнения массива
[/QUOTE]
А разве у самой функции max() сложноcть не O(n)?
Имел ввиду не размер массива, а его элементы. При a[n+1]=a[n]+1 на каждом шаге цикл будет заходить в конструкцию if, соответственно работать медленнее, а у array_keys + max скорость работы всё время примерно одна и таже (для одного размера массива). А вообще хз как там девелоперы php все встроенные ф-ии оптимизировали, как у них массив хранится и т.д. (ну и полюбому нативный код быстрее интерпретатора работает).
Цитата:
Рандомный массив, array_keys + max: dt = 0.140741014481
Упорядоченный массив, array_keys + max: dt = 0.141419506073
Рандомный массив, ручной проход: dt = 9.77529096603
Упорядоченный массив, ручной проход: dt = 15.2129662037
Так что согласен абсолютно.
P.S. Видимо, в нативных функциях действительно используется специфика хранения массивов. Иначе бы настолько результаты не отличались.
Цитата: Kesano
asort\sort используют, если не ошибаюсь, пузырьковый метод.
А если я не ошибаюсь, то пузырьковый метод самый медленный, поэтому вряд ли они его используют.