Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: array_shift

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Описание: Зачем выдергивать первый элемент массива?
Pavlentiy
Отправлено: 11 Марта, 2014 - 20:02:12
Post Id


Новичок


Покинул форум
Сообщений всего: 14
Дата рег-ции: Июль 2013  


Помог: 0 раз(а)




Зачем нужна данная функция и как она используется в реальных проектах?
 
 Top
IllusionMH
Отправлено: 11 Марта, 2014 - 20:24:55
Post Id



Активный участник


Покинул форум
Сообщений всего: 4254
Дата рег-ции: Февр. 2011  
Откуда: .kh.ua


Помог: 242 раз(а)




Pavlentiy, таким образом реализуется очередь на обработку. при этом не составляет труда добавлять новые элементы в конец, пока обработка до них не дошла.
 
 Top
Pavlentiy
Отправлено: 11 Марта, 2014 - 21:17:56
Post Id


Новичок


Покинул форум
Сообщений всего: 14
Дата рег-ции: Июль 2013  


Помог: 0 раз(а)




IllusionMH пишет:
Pavlentiy, таким образом реализуется очередь на обработку. при этом не составляет труда добавлять новые элементы в конец, пока обработка до них не дошла.


Спасибо большее за ответ. Можно пожалуйста продемонстрировать кусок кода из реального проекта с комментариями. Просто в доке примеры, мягко скажем, далеки от реальных ситуаций.
 
 Top
teddy
Отправлено: 11 Марта, 2014 - 21:30:55
Post Id


Участник


Покинул форум
Сообщений всего: 1462
Дата рег-ции: Апр. 2013  


Помог: 91 раз(а)




У этой функции нет "конкретной области" применения. Что бы было так вот тут её нужно применять и точка. Всё зависит от задачи что нам требуется и выбор функции для решения конкретной задачи так же исходят из смысла самой задачи.

array_shift может извлекать первый элемент массива. Где это может понадобится? Да где угодно, в зависимости от логики Вашего скрипта.

(Отредактировано автором: 11 Марта, 2014 - 21:32:33)

 
 Top
Pavlentiy
Отправлено: 11 Марта, 2014 - 21:35:39
Post Id


Новичок


Покинул форум
Сообщений всего: 14
Дата рег-ции: Июль 2013  


Помог: 0 раз(а)




teddy пишет:
У этой функции нет "конкретной области" применения. Что бы было так вот тут её нужно применять и точка. Всё зависит от задачи что нам требуется и выбор функции для решения конкретной задачи так же исходят из смысла самой задачи.

array_shift может извлекать первый элемент массива. Где это может понадобится? Да где угодно, в зависимости от логики Вашего скрипта.


Документация не дает понимания того, как применять эту функцию и как понять, когда и где ёё надо применять. Видел в скрипте, который подготавливал запрос к бд. Вот хотел узнать здесь, что и как.
 
 Top
OrmaJever Модератор
Отправлено: 11 Марта, 2014 - 21:51:23
Post Id



Активный участник


Покинул форум
Сообщений всего: 7540
Дата рег-ции: Янв. 2010  
Откуда: Чернигов


Помог: 299 раз(а)




Pavlentiy пишет:
Можно пожалуйста продемонстрировать кусок кода из реального проекта с комментариями.

То есть вы думаете тут у каждого есть реальные примеры со всеми функциями php? Зачем вам пример? Если вы не знаете где её применить то не используйте её, просто держите в голову что такая функция существует, придёт время и вы про неё вспомните.
(Добавление)
пошарьтесь тут https://github[dot]com/search?q=arra[dot][dot][dot]rm&type=Code . Я уверен что в двух миллионах записей вы найдёте что-то из очень реального примера.


-----
Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
 
 Top
Hapson
Отправлено: 12 Марта, 2014 - 16:09:50
Post Id



Посетитель


Покинул форум
Сообщений всего: 356
Дата рег-ции: Июнь 2013  
Откуда: Ставропольский край


Помог: 10 раз(а)

[+]


Pavlentiy
Pavlentiy пишет:
Документация не дает понимания того, как применять эту функцию и как понять, когда и где ёё надо применять.

Блин... я чуть под стол не упал!
array_shift
array_unshift
array_pop
array_push
Действительно, зачем же они? Улыбка
А array_reverse или shuffle - это вообще выше всякого понимания!
Да на кой черт вообще вся эта куча функций!? Написали кучу букав, да еще на нескольких языках, да еще куча сайтов передрали все это... но вот незадача - никто не пишет, как конкретно приготовить.
Кстати, не задумывался, накой нужны echo и print?


-----
ПЫХ тут - ходи туда, прежде чем писать сюда (толку больше будет)
 
 Top
esterio
Отправлено: 12 Марта, 2014 - 16:11:46
Post Id



Активный участник


Покинул форум
Сообщений всего: 5025
Дата рег-ции: Нояб. 2012  
Откуда: Украина, Львов


Помог: 127 раз(а)





Hapson
Сарказм засчитан Радость

(Добавление)
Вот нарил в одном старом проекте
PHP:
скопировать код в буфер обмена
  1. if($type = array_shift($types))
  2. {
  3.         list($section, $category, $topic) = explode('-', $type);
  4.         // ...
  5. }

но не думаю что это чем-либо поможет
 
 Top
EuGen Администратор
Отправлено: 13 Марта, 2014 - 14:55:20
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


Помог: 707 раз(а)




Не рекомендую пользоваться функцией array_shift без явной нужды. Она имеет сложность O(n) и извлечение элемента приводит к внутренней переиндексации.

Например (использована библиотека benchmark), сравнительные тесты:

PHP:
скопировать код в буфер обмена
  1. class Foo
  2. {
  3.     public static function shl(&$array)
  4.     {
  5.         //for "honest" comparison, extract result into separate $x
  6.         $x = array_shift($array);
  7.         return $x;
  8.     }
  9.    
  10.     public static function del(&$array)
  11.     {
  12.         $x = current($array);
  13.         unset($array[key($array)]);
  14.         return $x;
  15.     }
  16. }

- для тестирования метода, при этом второй вариант - с использованием функций массива. Код профилировки:

PHP:
скопировать код в буфер обмена
  1.  
  2. $measure    = new \Benchmark\Measure;
  3.  
  4. $data       = array_fill(0, 1E5, mt_rand());
  5. $x          = $measure->benchmarkTime(['Foo', 'shl'], [&$data], (int)1E5);
  6.  
  7. $data       = array_fill(0, 1E5, mt_rand());
  8. $y          = $measure->benchmarkTime(['Foo', 'del'], [&$data], (int)1E5);
  9. var_dump($x, $y);


Полученный результат (итоговое время/среднее время/число итераций):
PHP:
скопировать код в буфер обмена
  1. array(3) {
  2.   [1]=>
  3.   float(312.36020207405)
  4.   [2]=>
  5.   float(0.0031236020207405)
  6.   [3]=>
  7.   int(100000)
  8. }
  9. array(3) {
  10.   [1]=>
  11.   float(0.47592687606812)
  12.   [2]=>
  13.   float(4.7592687606812E-6)
  14.   [3]=>
  15.   int(100000)
  16. }


Это означает, что результат array_shift оказался на 3 порядка хуже, чем вариант с явным удалением ключа. И это - несмотря на то, что функция прекомпилирована. Естественно, чем дальше, тем хуже, так как сложность второго варианта есть O(1)


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
LIME
Отправлено: 13 Марта, 2014 - 15:47:39
Post Id


Активный участник


Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010  


Помог: 322 раз(а)




EuGen так ведь и смысл именно в переиндексации
PHP:
скопировать код в буфер обмена
  1. $x = current($array);
  2.         unset($array[key($array)]);
  3.         return $x;
нифига не обещает выборку первого элемента и не сдвигает все индексы
для чего и используется array_shift
EuGen пишет:
Не рекомендую пользоваться функцией array_shift без явной нужды.
незнаю даже где ее можно применить без нужды
разве кто-то решит получить таким образом первый элемент и при этом далее не будет использовать массив
 
 Top
EuGen Администратор
Отправлено: 13 Марта, 2014 - 16:02:48
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


Помог: 707 раз(а)




Смысл в том, что для извлечения первого элемента массива, в случае, если индексы не важны, достаточно связки current+key+unset, что будет намного быстрее. Разумеется, это зависит от контекста (имею ввиду, выборку первого элемента). Однако array_shift, в свою очередь, так же не полностью безопасен при работе с указателями массивов, так как при выходе за границу он сбросит указатель на первый доступный:

PHP:
скопировать код в буфер обмена
  1. $data = ['foo', 'bar', 'baz'];
  2. next($data);
  3.    current($data), //bar
  4.    array_shift($data), //foo
  5.    array_shift($data), //bar
  6.    $data, //['baz']
  7.    current($data) //baz
  8. );

С другой стороны, это вполне ожидаемое поведение.

Строго говоря, конструкции не эквивалентны, но в большинстве случаев, для извлечения первого элемента (особенно актуально в циклах) - намного корректнее использовать функции указателей.


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
LIME
Отправлено: 13 Марта, 2014 - 16:08:31
Post Id


Активный участник


Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010  


Помог: 322 раз(а)




ыгым
пожалуй действительно в большинстве случаев нет нужды сохранять отсчет индексов с 0
спасибо
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Вопросы новичков »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB