Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

PHP - вопрос по массивам.

7.3K
26 августа 2011 года
shureg
67 / / 29.05.2010
Доброго всем времени суток.
нужно помощь по работе с массивами. Нужно из массива выбрать самое большое значиние.

[CENTER][SIZE="5"]Пример:[/SIZE][/CENTER]
 
Код:
<?php
$myarray = array(0 => 15, 1 => 2, 2 = > 10, 3 => 22, 4 => 7);
?>

в этом массиве - самое больщое значение имеет: $myarray[3]; вот мне и нужно вытащить имееено порядковый номер в массиве, тут он равен: 3
у кого какие идеи будут?
244
26 августа 2011 года
UAS
2.0K / / 19.07.2006
Цитата:
у кого какие идеи будут?

А какие могут быть идеи для такой элементарнейшей задачи? Пройтись циклом по всем элементам и найти большее, сохранив его индекс. Две строчки

369
28 августа 2011 года
Kesano
451 / / 09.10.2007
Сначала не понял, почему УАС сказал про циклы, но через секунд 10 допёр - в теории так быстрее...
asort\sort используют, если не ошибаюсь, пузырьковый метод.
Т.е. массив перебирается много раз.
А в цикле foreach мы просто делаем что-то вроде if($val>$max) {$max=$val; } т.е. проходимся по массиву ровно один раз сравнивая с максимальным, на текущую итерацию, значением.

Тестил у себя... Разница в производительности небольшая... на массив в 100000 значений разница в 0.16с
278
28 августа 2011 года
Alexander92
1.1K / / 04.08.2008
Вопрос элементарный до безобразия, зачем такие бурные обсуждения разводить? :) Любая сортировка модифицирует сам массив, поэтому она не пригодна для задачи в принципе. А копировать массив в промежуточный только для того, чтобы найти индекс максимального элемента, - это, извините, порнография.
8
28 августа 2011 года
mfender
3.5K / / 15.06.2005
Цитата: Kesano
Тестил у себя... Разница в производительности небольшая... на массив в 100000 значений разница в 0.16с


И как оно? Стоит-ли эта разница стОлькой писанины? ))))

277
28 августа 2011 года
arrjj
1.7K / / 26.01.2011
В php есть фу-я max и array_keys :)
Самое быстрое (и правильное) решение -
[quote=http://stackoverflow.com/questions/1461348/return-index-of-highest-value-in-an-array]
 
Код:
$maxs=array_keys($array, max($array));

[/quote]
278
28 августа 2011 года
Alexander92
1.1K / / 04.08.2008
arrjj, не согласен. Ваш вариант проходится по массиву два раза - один раз при вызове max(), а второй раз - при вызове array_keys(). А можно пройтись один раз (правда, это при условии, что максимальное значение в массиве не повторяется).
277
28 августа 2011 года
arrjj
1.7K / / 26.01.2011
Всётки с сортировкой самый медленный способ, я просто цикл по массиву криво задал, поэтому он медленно отрабатывал.
А 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>';

Cкорость работы array_keys+max не меняется в зависимости от заполнения массива, а цикл по массиву идёт в среднем в два раза медленней при $array[]=$i (худший случай) чем по рендомному массиву.
278
28 августа 2011 года
Alexander92
1.1K / / 04.08.2008
Нет, ну то, что с сортировкой будет медленно, - это очевидно, я не про нее сейчас.

[QUOTE=arrjj]
Cкорость работы array_keys+max не меняется в зависимости от заполнения массива
[/QUOTE]
А разве у самой функции max() сложноcть не O(n)?
277
28 августа 2011 года
arrjj
1.7K / / 26.01.2011
Имел ввиду не размер массива, а его элементы. При a[n+1]=a[n]+1 на каждом шаге цикл будет заходить в конструкцию if, соответственно работать медленнее, а у array_keys + max скорость работы всё время примерно одна и таже (для одного размера массива). А вообще хз как там девелоперы php все встроенные ф-ии оптимизировали, как у них массив хранится и т.д. (ну и полюбому нативный код быстрее интерпретатора работает).
278
28 августа 2011 года
Alexander92
1.1K / / 04.08.2008
Понял, о чем вы. Да, согласен. Тестирование на массиве размером в 100000 элементов дало следующее:
Цитата:

Рандомный массив, array_keys + max: dt = 0.140741014481
Упорядоченный массив, array_keys + max: dt = 0.141419506073
Рандомный массив, ручной проход: dt = 9.77529096603
Упорядоченный массив, ручной проход: dt = 15.2129662037


Так что согласен абсолютно.

P.S. Видимо, в нативных функциях действительно используется специфика хранения массивов. Иначе бы настолько результаты не отличались.

366
29 августа 2011 года
int
668 / / 30.03.2005
Цитата: Kesano
asort\sort используют, если не ошибаюсь, пузырьковый метод.

А если я не ошибаюсь, то пузырьковый метод самый медленный, поэтому вряд ли они его используют.

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог