Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
php: array_unique с сохранением порядка ?
|
|||
|---|---|---|---|
|
#18+
Как проще выполнить уникализацию значений масива с сохранением порядка элементов ? array_unique порядок искажает, т.к. предварительно выполняет сортировку. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2014, 12:45 |
|
||
|
php: array_unique с сохранением порядка ?
|
|||
|---|---|---|---|
|
#18+
Cyrax_02Как проще выполнить уникализацию значений масива с сохранением порядка элементов ? array_unique порядок искажает, т.к. предварительно выполняет сортировку. Я для этого обычно хэш-массивами пользуюсь. Ну то есть я начинаю перебирать все элементы, и если встречаю новый, то пишу его значение как ключ в другой хэш-массив. Если оно там уже есть, то просто пропускаю (или если надо удалить все повторяющиеся элементы, то выполняю unset элемента основного массива). Может конечно есть способ легче, но так вроде получается достаточно просто и наглядно... так что других методов решения задачи не искал ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2014, 12:56 |
|
||
|
php: array_unique с сохранением порядка ?
|
|||
|---|---|---|---|
|
#18+
Так это "ручной" способ. Думал, можно стандартными функциями одной строчкой кода... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2014, 13:10 |
|
||
|
php: array_unique с сохранением порядка ?
|
|||
|---|---|---|---|
|
#18+
Cyrax_02, можно и легко Код: php 1. 2. 3. 4. 5. первый как ты сказал перемешает с нашей точки зрения порядок, но ориг, сохраняет порядок елементов, и потом ищем пересечение. второй вариант, дважды array_flip применить, тоже дубли уберуться, притом вкачестве ключа останеться последний, да и быстрее сработает думаю... вариантов куча, по большому щёту. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2014, 13:43 |
|
||
|
php: array_unique с сохранением порядка ?
|
|||
|---|---|---|---|
|
#18+
кстати... интересно... в документации видел, что предварительно при использовании array_unique будет произведена сортировка массива, что полностью подтверждает слова ТС. Однако решил попробовать сам сделать то же самое: Код: php 1. 2. Я неверно понял принцип сортировки используемый в этой функции? Или с какого-то момента она перестала сортировать массив перед проверкой? (php 5.5.1 у меня вроде... в общем 5.5.x точно). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2014, 13:50 |
|
||
|
php: array_unique с сохранением порядка ?
|
|||
|---|---|---|---|
|
#18+
авторпервый как ты сказал перемешает с нашей точки зрения порядок, но ориг, сохраняет порядок елементов, и потом ищем пересечение. второй вариант, дважды array_flip применить, тоже дубли уберуться, притом вкачестве ключа останеться последний, да и быстрее сработает думаю... вариантов куча, по большому щёту. Можно и так: Код: php 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2014, 14:57 |
|
||
|
php: array_unique с сохранением порядка ?
|
|||
|---|---|---|---|
|
#18+
Cyrax_02, Сорри, небольшой оффтоп... наш ведущий так делал (вернее он и щас так делает :) просто я на другом месте работаю): Cyrax_02if(!is_array($in_array)) { $in_array = array($in_array); } Мне всегда интересно было.. .а какая суть этого кода? :) это усложняет отладку, потому как, если я ошибся и передал например строку на вход в функцию, то не получу ни одной ошибки (типа $in_array is not array), а функция полетит себе дальше, только на выходе получится совсем не то, что ожидалось. У меня просто был такой случай однажды... когда в функцию на третьем уровне вложенности попадал не тот аргумент, что ожидался. В общем я очень долго искал причину... и самое обидное, что не там, где это нужно было. Потому интересно зачем это :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2014, 15:09 |
|
||
|
php: array_unique с сохранением порядка ?
|
|||
|---|---|---|---|
|
#18+
Так можно убрать эту строчку. И будет ошибка. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2014, 16:44 |
|
||
|
php: array_unique с сохранением порядка ?
|
|||
|---|---|---|---|
|
#18+
Cyrax_02Так можно убрать эту строчку. И будет ошибка. угумс... пхп заорёт (при правильно выставленных настройках, под debug) что в foreach был передан не массив. А с этой строчкой не заорёт... и получим скрытую ошибку (то есть ошибка есть, но мы об этом не узнаем). Одно дело когда это будет лежать перед глазами... а другое, если у нас система сложная с кучей уровней абстракций... фиг догадаешься где именно ошибка... просто на выход другие данные пришли и всё... И сразу надо в документацию конкретно углубляться и думать что же не так со входящими данными (а особенно интересно, если есть что-то, что разработчик не продумал и не описал, думая что это очевидно например). И всего этого можно избежать, если получить ошибку... например yii при этом очень удобную трассировку ошибки выдаёт. По ней без проблем за 5 минут вопрос решается не зависимо от уровня вложенности ошибки :) Рассмотреть то приходится с десяток строчек, а не сотни строк с кучей ветвлений (всмысле когда не знаешь где логика сбилась и почему). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2014, 16:54 |
|
||
|
php: array_unique с сохранением порядка ?
|
|||
|---|---|---|---|
|
#18+
авторМне всегда интересно было.. .а какая суть этого кода? :) Просто в некоторых случаях действительно такие операции нужны. И они вполне оправданы. Только вот в данном случае это лишнее, согласен. Часто на автомате пишешь функции "непривередливыми", не задумываясь.. авторнапример yii при этом очень удобную трассировку ошибки выдаёт. А Вы скрипты редактируете на локалке ? Потом заливаете на сервер, так ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2014, 19:02 |
|
||
|
php: array_unique с сохранением порядка ?
|
|||
|---|---|---|---|
|
#18+
Cyrax_02авторМне всегда интересно было.. .а какая суть этого кода? :) Просто в некоторых случаях действительно такие операции нужны. И они вполне оправданы. Только вот в данном случае это лишнее, согласен. Часто на автомате пишешь функции "непривередливыми", не задумываясь.. авторнапример yii при этом очень удобную трассировку ошибки выдаёт. А Вы скрипты редактируете на локалке ? Потом заливаете на сервер, так ? Нууу... последних полтора года я работал в команде через github. Потому да... я уже забыл что значит вести разработку напрямую на сервере )). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2014, 21:06 |
|
||
|
php: array_unique с сохранением порядка ?
|
|||
|---|---|---|---|
|
#18+
ПрограмёрCyrax_02, Сорри, небольшой оффтоп... наш ведущий так делал (вернее он и щас так делает :) просто я на другом месте работаю): Cyrax_02if(!is_array($in_array)) { $in_array = array($in_array); } Мне всегда интересно было.. .а какая суть этого кода? :) это усложняет отладку, потому как, если я ошибся и передал например строку на вход в функцию, то не получу ни одной ошибки (типа $in_array is not array), а функция полетит себе дальше, только на выходе получится совсем не то, что ожидалось. У меня просто был такой случай однажды... когда в функцию на третьем уровне вложенности попадал не тот аргумент, что ожидался. В общем я очень долго искал причину... и самое обидное, что не там, где это нужно было. Потому интересно зачем это :) передавай привет ведущему...я тоже так делаю. это имено тогда когда на вход может быть подан елемент, или масив елементов. подробней array_rand - вернёт или одино значение, либо масив значений. я в своём коде тоже имею функции которые могут вернуть либо елемент, либо масив елементов, и это может быть входом для других функций, которые продолжая линию партии, могут обрабатывать один елемент или несколько. и вот эта строка, имено это и делает, если просто елемент, делает из него масив с одним елементом, дабы остальной код по работе с масивами отработал. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.04.2014, 14:01 |
|
||
|
php: array_unique с сохранением порядка ?
|
|||
|---|---|---|---|
|
#18+
Програмёркстати... интересно... в документации видел, что предварительно при использовании array_unique будет произведена сортировка массива, что полностью подтверждает слова ТС. Однако решил попробовать сам сделать то же самое: Код: php 1. 2. Я неверно понял принцип сортировки используемый в этой функции? Или с какого-то момента она перестала сортировать массив перед проверкой? (php 5.5.1 у меня вроде... в общем 5.5.x точно). я про сортировку сказал только со слов автора....счас почитал доку, там нет ни слова что отдаст отсортированый масив по значению. там лишь сказано о алгоритме работы берёться масив, и сортируеться по значениям. потом и з этого масива будут браться первые встреченные ключи, имено по ним, и будет сформирован результат. итого имеем array(1,"1",0,"0") оно сначала отсортирует - получит два нуля потом две еденицы какстроки. возможно так [2]="0";[3]="0";[0]="1";[1]="1"; возможно [3]="0";[2]="0";[1]="1";[0]="1"; потом пробегая по этому делу будет брать с каждым значением что встретилось в первые ключ, дальше игнор. ввиду разных вариантов результата сортировки, не факт, что в рузльтате с значением ноль будет ключ 2, возможно 3...смотря что первее будет стоять после сортировки. понимаешь в чом суть? сортировка - это вспомагательный внутрений шаг, оно не сортирует результат. ... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.04.2014, 14:11 |
|
||
|
php: array_unique с сохранением порядка ?
|
|||
|---|---|---|---|
|
#18+
alex564657498765453ПрограмёрCyrax_02, Сорри, небольшой оффтоп... наш ведущий так делал (вернее он и щас так делает :) просто я на другом месте работаю): пропущено... Мне всегда интересно было.. .а какая суть этого кода? :) это усложняет отладку, потому как, если я ошибся и передал например строку на вход в функцию, то не получу ни одной ошибки (типа $in_array is not array), а функция полетит себе дальше, только на выходе получится совсем не то, что ожидалось. У меня просто был такой случай однажды... когда в функцию на третьем уровне вложенности попадал не тот аргумент, что ожидался. В общем я очень долго искал причину... и самое обидное, что не там, где это нужно было. Потому интересно зачем это :) передавай привет ведущему...я тоже так делаю. это имено тогда когда на вход может быть подан елемент, или масив елементов. подробней array_rand - вернёт или одино значение, либо масив значений. я в своём коде тоже имею функции которые могут вернуть либо елемент, либо масив елементов, и это может быть входом для других функций, которые продолжая линию партии, могут обрабатывать один елемент или несколько. и вот эта строка, имено это и делает, если просто елемент, делает из него масив с одним елементом, дабы остальной код по работе с масивами отработал. круууть )) Лотерея - угадай формат возвращаемых данных функция array_rand - это вообще сказка... Я хочу выбрать случайное число случайных элементов из массива... Как мне написать верный код? $res = array_rand($arr, random(1,count($arr))) что мне тут стоит ожидать на выходе? ну в общем ладно :) дело Ваше... мне такой подход очень не нравится по указанным причинам. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.04.2014, 14:42 |
|
||
|
php: array_unique с сохранением порядка ?
|
|||
|---|---|---|---|
|
#18+
Програмёрalex564657498765453пропущено... передавай привет ведущему...я тоже так делаю. это имено тогда когда на вход может быть подан елемент, или масив елементов. подробней array_rand - вернёт или одино значение, либо масив значений. я в своём коде тоже имею функции которые могут вернуть либо елемент, либо масив елементов, и это может быть входом для других функций, которые продолжая линию партии, могут обрабатывать один елемент или несколько. и вот эта строка, имено это и делает, если просто елемент, делает из него масив с одним елементом, дабы остальной код по работе с масивами отработал. круууть )) Лотерея - угадай формат возвращаемых данных функция array_rand - это вообще сказка... Я хочу выбрать случайное число случайных элементов из массива... Как мне написать верный код? $res = array_rand($arr, random(1,count($arr))) что мне тут стоит ожидать на выходе? ну в общем ладно :) дело Ваше... мне такой подход очень не нравится по указанным причинам. тебе такой подход нравиться!!! или хочь сказать тебе не удобно, что в виндоус можно выделить один файл а можно сразу много? или что открывать или грузить на форме можно одил или сразу несколько файлов? или то что вкладка в обозревателе может быть одна или несколько??? и во всех этих случаях, используеться масив, правда иногда в нём один елемент. но при использование чужого кода, при попадании данные в твой код, нужно - либо на старте сделать масив из единичного елемента, ибо стороний код может подавать по одному, либо в своём коде вечно делать проверку масив у тебя или значение, и вызывать либо один раз функцию обработчик либо в цикле много раз. ПРОСТОЙ ПРИМЕР обьект многострочное поле текста, где есть интерфейсные команды, добавить строку или несколько, удалить одну или несколько, заменить одну или несколько, выдать текст - все строки через перевод строки соеденены. при вставке возвращаеться индекс вставленный. выдача строк, всегда масивом что легче - два интерфейсных метода, один для единичной замены, вставки, удаления, получения, другой для множественной - или всётаки один метод на каждое действие?? естественно второй, а если тебя попросят реализовать такое дело, что ты будешь делать? правильно писать код по обработке масивов, и лишь в интерфейсных методах, поставишь проверку - не масив, сделать масив, и дальше задача сведена к решоной, обработка масива. а насчёт выдачи одного елемента или масива, удобно если ты изначально знаешь - у тебя либо один либо много. простой пример, получение записей из базы(обьектов)- по примари кею всегда один, по секции веар в общем много. можно делать несколько методов, а можно один - дали число, это примари кей, масив - данные для секции веар. на выходе в первом случае обьект - елемент, на втором масив обьектов(коллекция)... ЗЫ а почему тебя не смущает автоматическая типизация??? это большее обобщение кода чем один или несколько. один / несколько лишь составной елемент типизации. то что любая переменная может быть масивом а через пять минут строкой не смущает? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.04.2014, 12:58 |
|
||
|
php: array_unique с сохранением порядка ?
|
|||
|---|---|---|---|
|
#18+
alex564657498765453, всё намного проще... я определю чёткий формат данных - массив строк ))) И всё... проблема решена. Тот, кто использует мою библиотеку должен понимать, что мой код обслуживает массивы строк. А уж 10 строк в этом массиве или одна - значения не имеет. Главное что этим я добиваюсь соблюдения определённых правил :) И так и документирую: Функция принимает первым параметром массив строк, на выходе получаем массив строк или false в случае неудачи :) (false в случае неудачи - это вроде как стандарт для моего кода :) по возможности стараюсь придерживаться). P.S. Мы жёстко ушли в оффтоп. настроения спорить нету :) Я понял мысль: некоторые люди так привыкают к тому что у них массив - это и массив, и строка, и объект, и что угодно другое, что не мыслят программирование без этого. Я считаю программирование точной наукой (где всё предопределено и оговорено заранее)... а Вы видимо считаете программирование гуманитарным предметом (ну то есть программа - это сочинение на тему ...). Потому мы к согласию не придём :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.04.2014, 13:11 |
|
||
|
php: array_unique с сохранением порядка ?
|
|||
|---|---|---|---|
|
#18+
Програмёр, ну так пхп на том и построен, отсутсвие типизации! ЗЫ твоей библиотекой будет пользоваться не удобно, ибо в коде кучу раз надо будет добавить человеку одну строку, и он постоянно будет это в масив оборачивать, потому что тебе это было лень сделать один раз!! :) ЗЫЗЫ в строготипизированных языках, добавили тип вариант - данные любого типа, ибо без него, програмисты желая сделать код удобным, почтоянно имитировали это через свои структуры данных. ты застопорил внимание, что тебе надо проверять результат такой функции. а я тебе говорю, что без типизации - тип надо проверять постоянно, и вопрос - это делать постоянно во всех вызывающих местах кода или в одном вызываемом? а нащот возвращения результата, который может быть разного типа, так тип имеет значение, если это конечный результат, если промежуточный - передаёться дальше а другая функция тоже может понять что это. - call_user_func($callable); - не смущает что коллаб может быть строкой, может масивом, а может обьектом(замыкание). полагаю удобство входных данных разного типа тёбя я уже убедил :) выходные разнотипные данные - если функция определения длины строки, на вход получив строку выдаст число, масив строк - масив чисел, это тебя не смущает полагаю. это называеться перегрузка методов в языках с строго типизацией, дабы обеспечить поддержку разного поведения при разных входных данных. оооо придумал. клас хелпер, который выдаёт колбеки для разных задач по обработке даных в масивах. может выдать строку - имя пхпшной функции(скажем срез пробелов), может масив строк - класс и функция - скажем шифрование(наш клас шифратор) - может замыкание, то что было переопределено в процесе работы. полагаю точно не будет смущатЬ??? вот о чом я говорю, если это всёравно результат промеждуточный для другого кода, который сможет его понять, это очень удобно. ЗЫЗЫЗЫЗЫ 1)тип вариант - для задания разнотипных даных 2)перегрузка методов - переопределение функции для других входных данных 3)автоприведение типов, для поддержки менее строгих ограничений на входные данные. 4)и собственно ООП это всё люди спецально придумывали ради некоторых, которые не хотят строгости???:) про ооп поясню. идея процедурного стиля была в чом, есть алгоритм, как из А получить Б, надо тоже самое, но только на этапе проверки на пустоту, масив пустых значений тоже щитать пустой величиной, - надо будет заменить одну функцию ооп, есть решонная задача, для структуры данных1(=тип данных) надо тоже самое для другой - не переписываем код, а учим теже функции на входе принять возможно другого типа(как вариация другое количество) входных данных. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.04.2014, 15:25 |
|
||
|
php: array_unique с сохранением порядка ?
|
|||
|---|---|---|---|
|
#18+
alex564657498765453, а давайте создадим одну функцию, которая будет при получении двух чисел их суммировать, двух строк - определять сумму их длин, двух массивов - определять общее количество их элементов, двух хеш-массивов (с нечисловыми ключами) - определять количество уникальных элементов, двух объектов - определять количество уникальных атрибутов, числа и массива - суммировать к числу количество элементов массива, строку и массив - суммировать длину строки и количество элементов массива. просто такое поведение одной функции очень удобно... что бы я туда не передал, я получу некое число, которое означает... да фиг знает что оно означает ))) просто очень удобная функция для вычисления очень удобного числа. Насчёт перегрузки методов - это другое. Придумывалось не для таких извратов, которые Вы описали. А придумывалась перегрузка методов для создания одноимённых методов с разным количеством аргументов (ну то есть для определения значений по умолчанию для аргументов функций). Кстати... там логика функций для разных аргументов разделена на несколько методов (1 метод для каждого списка аргументов). И все IDE показывают такие методы как множество одноимённых, а не каша аргументов для одного метода. Насчёт ООП... а причём тут оно?!!!! O_o !!! насчёт callable... ну решили создатели этой функции сделать так... но я этой функцией не пользуюсь... мне намного удобнее call_user_func_array() Так вот в этой функции можно было бы спокойно сделать 3 аргумента: объект(или null), название метода, аргументы ... не вижу проблемы :) А можно и вообще определить функцию для 2 или 3 аргументов (это как-раз и будет аналогом перегрузки методов). Тип variant... Я начинал изучение с паскаля... услышал чисто случайно на третьем годе обучения (когда на делфи практиковался)... И то узнал из книжки где было написано "также существует тип variant, который может заменять любой тип, но настоятельно рекомендуется его не использовать из-за чрезмерной затратности ресурсов и падения производительности при работе с данным типом". Вот таким было моё знакомство с данным типом данных )) Почти все нетипизированные языки создавались под лозунгом "программировать может каждый".... читаем лозунг и вдумываемся... и вспоминаем про гуманитарий ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.04.2014, 17:16 |
|
||
|
|

start [/forum/topic.php?fid=23&msg=38622860&tid=1462830]: |
0ms |
get settings: |
10ms |
get forum list: |
11ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
70ms |
get topic data: |
7ms |
get forum data: |
2ms |
get page messages: |
35ms |
get tp. blocked users: |
1ms |
| others: | 223ms |
| total: | 363ms |

| 0 / 0 |
