|
PHP - поменять ключ в массиве
|
|||
---|---|---|---|
#18+
Можно ли в существующем массиве изменить ключ элемента? Такое разумеется не сработало: Код: php 1. 2. 3. 4. 5. 6. 7.
Ну а [&$v=>&$v] не компилируется. Есть какие-нибудь обходные способы? Пока что наиболее близкое получилось такое: Код: php 1. 2. 3. 4. 5.
... |
|||
:
Нравится:
Не нравится:
|
|||
30.12.2018, 13:16 |
|
PHP - поменять ключ в массиве
|
|||
---|---|---|---|
#18+
зачем? ... |
|||
:
Нравится:
Не нравится:
|
|||
31.12.2018, 00:38 |
|
PHP - поменять ключ в массиве
|
|||
---|---|---|---|
#18+
Код: php 1. 2.
в компах нет никакой "магии" всё есть "последовательность байтов" (из 0/1), а на нижнем уровне просто набор инструкций - куда чего в памяти переместить/посчитать ... |
|||
:
Нравится:
Не нравится:
|
|||
31.12.2018, 03:05 |
|
PHP - поменять ключ в массиве
|
|||
---|---|---|---|
#18+
полудух, ТС такой же вариант написал, и даже лучше. ... |
|||
:
Нравится:
Не нравится:
|
|||
31.12.2018, 08:34 |
|
PHP - поменять ключ в массиве
|
|||
---|---|---|---|
#18+
Hettполудух, ТС такой же вариант написал, и даже лучше. это? автор Код: php 1. 2.
рановато вы праздновать начали ... |
|||
:
Нравится:
Не нравится:
|
|||
31.12.2018, 08:51 |
|
PHP - поменять ключ в массиве
|
|||
---|---|---|---|
#18+
полудух Код: php 1. 2.
Так себе решение. Такой способ очевиден, он далеко не лучший. ... |
|||
:
Нравится:
Не нравится:
|
|||
31.12.2018, 19:22 |
|
PHP - поменять ключ в массиве
|
|||
---|---|---|---|
#18+
Alibek B.он далеко не лучшийВ каком отношении не лучший и почему, что конкретно в этом способе плохо? ... |
|||
:
Нравится:
Не нравится:
|
|||
31.12.2018, 19:36 |
|
PHP - поменять ключ в массиве
|
|||
---|---|---|---|
#18+
а) Не сохраняет порядок элементов. б) Копирует элемент массива вместо копирования ссылки на элемент. ... |
|||
:
Нравится:
Не нравится:
|
|||
31.12.2018, 21:41 |
|
PHP - поменять ключ в массиве
|
|||
---|---|---|---|
#18+
вы удаляете этот элемент, какая ещё ссылка ... |
|||
:
Нравится:
Не нравится:
|
|||
31.12.2018, 21:47 |
|
PHP - поменять ключ в массиве
|
|||
---|---|---|---|
#18+
Alibek B., а) Ну дык порядок и не должен сохраняться при такой операции. Об этом где-то в инструкции по PHP сказано. Другой вопрос, если такое поведение PHP, как изменение порядка элементов, не подходит для конкретной Вашей задачи . Тут уж, звиняйте. Но оно никак не отвечает на вопрос о том, что плохо в этом способе или что хорошо. б) Об этом (клонирование или дублирование фрагмента памяти, содержащего данные) где-то явно сказано или Вы смотрели исходники PHP в части манипуляций с элементами массива? ... |
|||
:
Нравится:
Не нравится:
|
|||
31.12.2018, 22:24 |
|
PHP - поменять ключ в массиве
|
|||
---|---|---|---|
#18+
полудухвы удаляете этот элемент, какая ещё ссылка Это заблуждение. unset не удаляет содержимое элемента. ... |
|||
:
Нравится:
Не нравится:
|
|||
31.12.2018, 23:23 |
|
PHP - поменять ключ в массиве
|
|||
---|---|---|---|
#18+
vkleОб этом (клонирование или дублирование фрагмента памяти, содержащего данные) где-то явно сказано http://php.net/manual/ru/language.references.whatdo.php ... |
|||
:
Нравится:
Не нравится:
|
|||
31.12.2018, 23:25 |
|
PHP - поменять ключ в массиве
|
|||
---|---|---|---|
#18+
vkleНо оно никак не отвечает на вопрос о том, что плохо в этом способе или что хорошо. Мне - отвечает. Вопрос был в том, как поменять ключ. При чистом изменении ключа сам массив меняться не должен, равно как порядок элементов. ... |
|||
:
Нравится:
Не нравится:
|
|||
31.12.2018, 23:29 |
|
PHP - поменять ключ в массиве
|
|||
---|---|---|---|
#18+
Alibek B.vkleОб этом (клонирование или дублирование фрагмента памяти, содержащего данные) где-то явно сказано http://php.net/manual/ru/language.references.whatdo.php При чем тут ссылки то? Хотя, если хотите использовать ссылки, то там как раз сказано: обе переменные указывают на одни и те же данные и никакого копирования не происходит Однако, раз уж говорим тут о присваивании вида $b = $a , то для скалярных переменных - в мануале смотрите тут http://php.net/manual/ru/features.gc.refcounting-basics.php Пример #3 . Таки ссылка добавляется. Для объектов происходит присваивание по ссылке, об этом явно сказано тут: http://php.net/manual/ru/language.operators.assignment.php Таким образом, насчет копирования Вы ошибаетесь в любом случае. Alibek B.При чистом изменении ключа сам массив меняться не должен, равно как порядок элементов.Вполне возможно, если в ЯП присутствует функция, которая именно так работает. Но, увы. Несмотря на довольно обширный набор функций PHP для работы с массивами http://php.net/manual/ru/book.array.php ... |
|||
:
Нравится:
Не нравится:
|
|||
01.01.2019, 00:26 |
|
PHP - поменять ключ в массиве
|
|||
---|---|---|---|
#18+
Alibek B.полудухвы удаляете этот элемент, какая ещё ссылка Это заблуждение. unset не удаляет содержимое элемента. http://fi2.php.net/manual/ru/function.unset.php Код: php 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12.
// удаляем один элемент массива ... |
|||
:
Нравится:
Не нравится:
|
|||
01.01.2019, 06:15 |
|
PHP - поменять ключ в массиве
|
|||
---|---|---|---|
#18+
Заблуждение не перестает быть таковым, независимо от количества повторений. Код: php 1. 2. 3. 4. 5. 6. 7. 8.
Посоветую читать англоязычную документацию. И посмотреть в словарях значения слов remove и destroy. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.01.2019, 08:48 |
|
PHP - поменять ключ в массиве
|
|||
---|---|---|---|
#18+
полудухAlibek B.пропущено... Это заблуждение. unset не удаляет содержимое элемента. http://fi2.php.net/manual/ru/function.unset.php Код: php 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12.
// удаляем один элемент массива Ну, с Новым годом! Элемент массива (ссылка на область памяти, где хранится значение) и содержимое элемента массива (область памяти, выделенная для хранения значения) совсем не одно и то же. Вы можете удалить элемент из массива или удалить переменную, но очисткой памяти от неиспользуемых данных занимается механизм Garbage Collection, он же сборщик мусора. Если он включен, конечно. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.01.2019, 11:22 |
|
PHP - поменять ключ в массиве
|
|||
---|---|---|---|
#18+
Alibek B.Заблуждение не перестает быть таковым, независимо от количества повторений. Код: php 1. 2. 3. 4. 5. 6. 7. 8.
Посоветую читать англоязычную документацию. И посмотреть в словарях значения слов remove и destroy. вы укуренный чтоли там ещё в добавок нахрена вы копируете $lazarus['a'] в отдельную переменную, а затем эту переменную ставите в $lazarus['b] ?!? и вуаля - ФОКУС ГОТОВ! при этом $lazarus['a'] там, как и положено, благополучно удалён unset-ом зы: и можете даже ссылку убрать - эффект тот же. vkleНу, с Новым годом! Элемент массива (ссылка на область памяти, где хранится значение) и содержимое элемента массива (область памяти, выделенная для хранения значения) совсем не одно и то же. Вы можете удалить элемент из массива или удалить переменную, но очисткой памяти от неиспользуемых данных занимается механизм Garbage Collection, он же сборщик мусора. Если он включен, конечно. угу, счастья, здоровья... а вдруг прогер внезапно пишет на C++ и САМ удаляет всё за собой? в пхп таки есть ГЦ, но это неважно Удалён он там физически или ждём ГЦ, а в массиве его уже нет после unset(). ... |
|||
:
Нравится:
Не нравится:
|
|||
01.01.2019, 12:06 |
|
PHP - поменять ключ в массиве
|
|||
---|---|---|---|
#18+
полудухзы: и можете даже ссылку убрать - эффект тот же. Смешной ты и необразованный. Код: php 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.
Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26.
... |
|||
:
Нравится:
Не нравится:
|
|||
01.01.2019, 12:14 |
|
PHP - поменять ключ в массиве
|
|||
---|---|---|---|
#18+
Код: php 1. 2. 3. 4. 5. 6. 7.
Alibek B., я думаю, Вы бы и самостоятельно додумались до такого грубого решения. Но если так, почему такие вопросы? ... |
|||
:
Нравится:
Не нравится:
|
|||
01.01.2019, 15:04 |
|
PHP - поменять ключ в массиве
|
|||
---|---|---|---|
#18+
Не до такого, как вариант с сохранением порядка элементов я думал использовать range с последующим combine. Но и это опять же не замена ключа в массиве, а формирование нового массива. Мне интересно именно изменить ключ. Может быть есть такой способ, просто я его не знаю, так как PHP я использую от случая к случаю и утилитарно. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.01.2019, 15:27 |
|
PHP - поменять ключ в массиве
|
|||
---|---|---|---|
#18+
Что касается задачи, то я пишу скрипт-сервис (работающий как демон), который взаимодействует с внешней системой. В этом скрипте есть вспомогательный справочник (массив), используемый для быстрого поиска данных пользователей по номеру телефона (номер телефона - ключ). Но в информационной системе у пользователей номер телефона может меняться и в этом случай справочник нужно обновить. При этом по определенным причинам хотелось бы сохранить порядок элементов в справочнике. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.01.2019, 15:33 |
|
PHP - поменять ключ в массиве
|
|||
---|---|---|---|
#18+
Alibek B.полудухзы: и можете даже ссылку убрать - эффект тот же. Смешной ты и необразованный. а ты тупой, как воробушек. в примере опят unset() отработал именно так, как и должен был а именно - удалил элементы массива. надежды на то, что он сотрёт r2 вместе со ссылкой опять же подчёркивают полную безграмотность вопрошающего юнца (даже если допустить, что вместо &$a1 там &$a2) очень хочется верить, что эти "гениальные" примеры перерастут во что-то стоящее ДО следующего нового года. Alibek B.Что касается задачи, то я пишу скрипт-сервис (работающий как демон), который взаимодействует с внешней системой. В этом скрипте есть вспомогательный справочник (массив), используемый для быстрого поиска данных пользователей по номеру телефона (номер телефона - ключ). Но в информационной системе у пользователей номер телефона может меняться и в этом случай справочник нужно обновить. При этом по определенным причинам хотелось бы сохранить порядок элементов в справочнике. потому что БД лишний раз дёргать не хочется ты ещё и коллега, студент причина тут одна - неопытный дурачок кастует самому себе (и людям, что гораздо важнее) палки в колёсах парсеры иди пиши, а не ИФ, твоя архитектура - говно. Модератор: За своими словами следите, пожалуйста. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.01.2019, 16:53 |
|
PHP - поменять ключ в массиве
|
|||
---|---|---|---|
#18+
Alibek B.Что касается задачи, то я пишу скрипт-сервис (работающий как демон), который взаимодействует с внешней системой. В этом скрипте есть вспомогательный справочник (массив), используемый для быстрого поиска данных пользователей по номеру телефона (номер телефона - ключ). Но в информационной системе у пользователей номер телефона может меняться и в этом случай справочник нужно обновить. При этом по определенным причинам хотелось бы сохранить порядок элементов в справочнике. Ты не можешь сохранить порядок элементов в хэше, никак, это как запрос select из базы без order by, порядок не гарантируется. Тем более, что при перестроении списка ключей связи меняются. Поиск по ключу хеша это O(1), ему пофиг на порядок, он итак быстрый. Сравни вывод для Код: php 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14.
и Код: php 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14.
Они идентичны. Не нужно без повода использовать & Вот пример опкодов для $a[$new] = &$a[$old]; Код: plaintext 1. 2. 3. 4. 5. 6.
и $a[$new] = $a[$old]; Код: plaintext 1. 2. 3. 4. 5.
Второй более оптимален в таком варианте. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.01.2019, 17:24 |
|
PHP - поменять ключ в массиве
|
|||
---|---|---|---|
#18+
KarbafosВторой более оптимален в таком варианте. Если говорить абстрактно, то видимо да. В Perl хеши вообще неупорядоченны и это обычно не мешает. Но в моей задаче хранение справочника в массиве это только часть задачи. Мне в определенных случаях нужно использовать исходную последовательность элементов. Эту последовательность можно получить тремя способами: 1. Изменить ключ - если это вообще возможно, это был бы лучший способ. 2. Пересобрать массив (с использованием range или flip) - надёжно, но неэффективно и теоретически возможны утечки памяти (если GC будет работать недостаточно эффективно). 3. Добавлять элемент с новым ключом (моим способом), а затем сортировать полученный массив с помощью uksort. Но тут под вопросом производительность. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.01.2019, 17:58 |
|
PHP - поменять ключ в массиве
|
|||
---|---|---|---|
#18+
полудухпарсеры иди пиши, а не ИФ, твоя архитектура - говно. Видно птицу по полету, а малолетку по помету лексикону. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.01.2019, 18:03 |
|
PHP - поменять ключ в массиве
|
|||
---|---|---|---|
#18+
KarbafosТы не можешь сохранить порядок элементов в хэше, никак, это как запрос select из базы без order by, порядок не гарантируется. Это про PHP или Perl? В PHP массивы прекрасно упорядочиваются. Собственно это одно из преимуществ PHP в моем случае, благодаря этой особенности формировать JSON намного проще. В Perl генерация JSON с упорядоченными элементами будет сложнее. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.01.2019, 18:29 |
|
PHP - поменять ключ в массиве
|
|||
---|---|---|---|
#18+
Alibek B.KarbafosТы не можешь сохранить порядок элементов в хэше, никак, это как запрос select из базы без order by, порядок не гарантируется. Это про PHP или Perl? В PHP массивы прекрасно упорядочиваются. Собственно это одно из преимуществ PHP в моем случае, благодаря этой особенности формировать JSON намного проще. В Perl генерация JSON с упорядоченными элементами будет сложнее. Речь про php и его массивы, которые практически в любом виде -- хеши. Новый ключ -- новое распределение внутри бакетов, новый порядок. Речь разумеется об оригинальном массиве, а не отсортированном после изменения. В любом случае, если такой вопрос возникает, значит что-то делается неправильно и есть путь более простой. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.01.2019, 18:44 |
|
PHP - поменять ключ в массиве
|
|||
---|---|---|---|
#18+
Alibek B.1. Изменить ключ - если это вообще возможно, это был бы лучший способ. Если все так плохо, что остальные способы не годятся, то несколько фантастический вариант - написать свое расширение PHP с реализацией требуемой функции. Непросто, конечно, да и поддерживать его придется. Просто любопытно, при каких количествах элементов, обновлений, обращений вопрос столь жестко уперся именно в производительность на этапе обновления номера телефона? ... |
|||
:
Нравится:
Не нравится:
|
|||
01.01.2019, 18:59 |
|
PHP - поменять ключ в массиве
|
|||
---|---|---|---|
#18+
vkleAlibek B.1. Изменить ключ - если это вообще возможно, это был бы лучший способ. Если все так плохо, что остальные способы не годятся, то несколько фантастический вариант - написать свое расширение PHP с реализацией требуемой функции. Непросто, конечно, да и поддерживать его придется. Просто любопытно, при каких количествах элементов, обновлений, обращений вопрос столь жестко уперся именно в производительность на этапе обновления номера телефона? судя по всему, вопрос не в производительности, а в порядке элементов в json, где-то он важен, но если это так, до реально дичь какая-то происходит ... |
|||
:
Нравится:
Не нравится:
|
|||
01.01.2019, 19:54 |
|
PHP - поменять ключ в массиве
|
|||
---|---|---|---|
#18+
Karbafos, Так я понял, что и то и другое важно. В посте 21777374 про эффективность (впрочем, это понятие весьма расплывчатое) и производительность упоминается. Да и раньше тож. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.01.2019, 20:13 |
|
PHP - поменять ключ в массиве
|
|||
---|---|---|---|
#18+
vkleнаписать свое расширение PHP с реализацией требуемой функции Это слишком сложно для меня. Мне нужно автоматизировать одну задачу без слишком больших трудозатрат. Чтобы написать свое расширение PHP, нужно слишком глубоко погружаться. Karbafosа в порядке элементов в json, где-то он важен, но если это так, до реально дичь какая-то происходит Тут наложение двух особенностей. Во-первых — мне нужно сделать интеграцию двух систем, своей и внешней, и своя не поддерживает события. Поэтому вместо обработчика события я периодически получаю с двух систем наборы данных, сравниваю их между собой и формирую задания на синхронизацию наборов. Во-первых — мне нужно работать с внешним REST-сервисом, в котором стиль REST несколько расширяется — в GET/POST можно передать массив элементов и запрос вернет результат для переданного массива (вместо построчной обработки). Поэтому в итоге мне нужно направить на внешний сервер один массив данных, а затем другой, в котором сущности перечислены в том же порядке. vkleТак я понял, что и то и другое важно Если это возможно, то лучше всегда написать что-то более эффективное, чем что-то менее эффективное. Эффективность — это и производительность (впрочем ее в любом случае хватает), и минимизация использования ресурсов. Если планируется, что скрипт будет подолгу работать в круглосуточном режиме, то любые массовые манипуляции с массивами могут выливаться в утечки памяти. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.01.2019, 20:31 |
|
PHP - поменять ключ в массиве
|
|||
---|---|---|---|
#18+
Alibek B.Если это возможно, то лучше всегда написать что-то более эффективное, чем что-то менее эффективное.Дык, кто же спорит? Нет предела совершенству! :) Alibek B.минимизация использования ресурсовПожалуй, дополню. Ваше время, потраченное на решение задачи - тоже ресурс. Невосполнимый. Потратив час на решение, Вы не сможете использовать этот самый час в каких-то других целях. При таком раскладе эффективным решением будет второй или третий вариант, раз уж с производительностью нет особых проблем. Или, даже четвертый, где новый массив будет создан с нуля вместо старого. Заодно и природную лень можно потешить - не придется, скорее всего, решать проблему утечки памяти, если таковая вылезет в этом месте. К тому же, начальству до фонаря, скорее всего, как именно решена задача. Будет готово к вечеру - "отлично!", через два дня "ну ладно, хорошо", а ежле неделю искать красивое решение - "чего вы там возюкаетесь??". Ну как-то так. Alibek B.скрипт будет подолгу работать в круглосуточном режимеИ что с того, что в круглосуточном? Важно, сколько и каких будет проведено итераций за единицу времени. Так то, не составляет проблем положить sleep() внутрь бесконечного цикла - да хоть год пусть работает, ничего с ним не случится. :) Ну а если серьезно, были у меня долгоиграйки на пхп, работавшие от нескольких часов до пары недель с периодичностью итераций порядка нескольких секунд, с обращением к внешним ресурсам (мускуль, мемкеш, файлы, что-то по http). В начале главного цикла инициализация всех внутренних переменных, в основном. Ну и корректная обработка недоступности ресурсов. И ничего особенного, никто не помер и память не выжрал. Появилась бы какая серьезная проблема в долгоиграйстве - ну перезапустить можно раза два или три за сутки. Этого никто вообще не заметит! Конечно, если только скрипт не будет пол-часа инициализироваться. :) Вот если ресурсов на пять минут работы не хватает - тогда да, тогда серьезная проблема. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.01.2019, 21:44 |
|
|
start [/forum/topic.php?all=1&fid=23&tid=1460047]: |
0ms |
get settings: |
8ms |
get forum list: |
12ms |
check forum access: |
5ms |
check topic access: |
5ms |
track hit: |
29ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
65ms |
get tp. blocked users: |
1ms |
others: | 10ms |
total: | 145ms |
0 / 0 |