Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Массив изменить часть значений
|
|||
|---|---|---|---|
|
#18+
Всем доброго дня. Есть ли что-нибудь изящней, чем перебор массива в цикле для смены определенной части значений? Поясню: массив значений array (0,1,2,2,2,1); мне нужно к примеру, с индекса 2 по 5 изменить значения на 0. Спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.02.2014, 07:47 |
|
||
|
Массив изменить часть значений
|
|||
|---|---|---|---|
|
#18+
AlexSes, именно такой функции нет. чтоб меняла именно с 2 по 5 элемент массива. весь массив тоже нет необходимости перебирать, достаточно пробежаться по нужным индексам, типа Код: php 1. 2. 3. 4. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.02.2014, 07:55 |
|
||
|
Массив изменить часть значений
|
|||
|---|---|---|---|
|
#18+
Спасибо. Ваш пример выглядит симпатичней, но тоже цикл:) Да, и весь массив у меня не будет перебираться, потому что старт-индекс задается заранее. я, правда сделал по-пролетраски: Код: php 1. 2. 3. Жаль аналога array_fill() для подобной задачи нет.. Хотя.. если поизвращаться, то можно и функциями array_slice() и array_fill() + слияние 2-х массивов сделать.. Но изящности, имхо, в этом мало.. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.02.2014, 08:08 |
|
||
|
Массив изменить часть значений
|
|||
|---|---|---|---|
|
#18+
AlexSesХотя.. если поизвращаться, то можно и функциями array_slice() и array_fill() + слияние 2-х массивов сделать.. Но изящности, имхо, в этом мало.. слиянием не получится. array_merge: ... если массивы имеют одинаковые числовые ключи, значение, упомянутое последним, не заменит исходное значение, а будет добавлено в конец массива. если только слияние вручную делать. но это еще хуже. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.02.2014, 11:10 |
|
||
|
Массив изменить часть значений
|
|||
|---|---|---|---|
|
#18+
AlexSesСпасибо. Ваш пример выглядит симпатичней, но тоже цикл:) Да, и весь массив у меня не будет перебираться, потому что старт-индекс задается заранее. я, правда сделал по-пролетраски: Код: php 1. 2. 3. Жаль аналога array_fill() для подобной задачи нет.. Хотя.. если поизвращаться, то можно и функциями array_slice() и array_fill() + слияние 2-х массивов сделать.. Но изящности, имхо, в этом мало.. А какая разница кто перебор запустит, Вы или сам интерпретатор? По сути, если надо заменить часть значений в массиве, значит или их перебором поменять, или подменить часть массива другим массивом. Второй метод точно также потребует перебора для создания массива, так как заранее количество заменяемых элементов не известно ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.02.2014, 12:47 |
|
||
|
Массив изменить часть значений
|
|||
|---|---|---|---|
|
#18+
> Програмёр Ну, это понятно конечно, просто код у r u в ответе выглядит изящней, чем мой - с инкрименирующей переменной i :). > r u а почему слиянием не получится? Код: php 1. 2. 3. 4. 5. 6. 7. 8. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.02.2014, 05:26 |
|
||
|
Массив изменить часть значений
|
|||
|---|---|---|---|
|
#18+
AlexSes, в целом получится, но не сразу)) в вашем примере этого не видно, а вот так: Код: php 1. 2. 3. 4. 5. обратите внимание на ключи результирующего массива. требуется сортировка в общем очень громоздко получается. в качестве работчего варинта негодится, учитывая что есть боле простые и быстрые варианты ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.02.2014, 06:33 |
|
||
|
Массив изменить часть значений
|
|||
|---|---|---|---|
|
#18+
Ну, в вашем примере действительно, массив требует сортировки. В продолжение моего примера с объединением, если оперировать с $a[$i], то как бы, всё на своем месте:) В любом случае, конструкция с вышеприведенными функциями выглядит действительно громоздко, что, наверное, не отвечает первоначальной задачи - изящности. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.02.2014, 07:26 |
|
||
|
Массив изменить часть значений
|
|||
|---|---|---|---|
|
#18+
AlexSes > Програмёр Ну, это понятно конечно, просто код у r u в ответе выглядит изящней, чем мой - с инкрименирующей переменной i :). А в чём изящней? Я бы согласился, если бы разговор касался питона (хотя там есть методы и удобнее, там просто срезы продуманы лучше чем в пхп, там можно один срез заменить другим срезом или массивом). Однако, не забываем, что в питоне range - это генератор, а в пхп генераторов нету, потому возвращается массив :) Не большое, но всё же лишнее потребление памяти. Потому лично я считаю метод с обычным for самым оптимальным в данной ситуации. Вот это я понимаю изящество :) Код: python 1. 2. 3. 4. 5. 6. 7. Я новичёк в питоне... так что уверен, что это не предел изящества :) (срезы - великая сила... очень удобно, учитывая. что есть параметр step позволяющий обрабатывать не каждый элемент) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.02.2014, 15:30 |
|
||
|
Массив изменить часть значений
|
|||
|---|---|---|---|
|
#18+
Програмёресли бы разговор касался питона причем здесь питон... к чему эта попытка создать холивар на пустом месте? используйте хоть do{}while() если хотите. тоже можно. и может даже быстрее. кто измерял?) ПрограмёрНе большое, но всё же лишнее потребление памяти. еще предложите echo вместо print, и преинкремент вместо постинкремента... сразу видно что опыта в программировании мало, борьба с придуманными ветрянными мельницами. это пройдет, но не сразу ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.02.2014, 05:52 |
|
||
|
Массив изменить часть значений
|
|||
|---|---|---|---|
|
#18+
r uПрограмёресли бы разговор касался питона причем здесь питон... к чему эта попытка создать холивар на пустом месте? используйте хоть do{}while() если хотите. тоже можно. и может даже быстрее. кто измерял?) ПрограмёрНе большое, но всё же лишнее потребление памяти. еще предложите echo вместо print, и преинкремент вместо постинкремента... сразу видно что опыта в программировании мало, борьба с придуманными ветрянными мельницами. это пройдет, но не сразу ) Мало - это сколько? :) То есть, если я с умом подхожу к ресурсам и предпочитаю создавать цикл стандартным образом (предусмотренным в языке для этого), а не с изворотом, то я не опытный программист? Я просто не вижу ни одного преимущества foreach(range(...)) перед обычным for, о чём и сказал. Про питон... Ну автор же искал изящество, я показал как вижу это в идеале (раздел не запрещает вести общение про питон. Я же не залез в ветку C++ и не стал разводить тему, почему Дэлфи лучше). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.02.2014, 10:45 |
|
||
|
Массив изменить часть значений
|
|||
|---|---|---|---|
|
#18+
Можно еще по-другому заставить интерпретатор перебор сделать :) Код: php 1. 2. Но коллеги в будущем вас за такой код угробят, ибо для поставленной задачи - цикл - самоочевидное решение, даже не требующее комментариев в коде. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.02.2014, 11:30 |
|
||
|
Массив изменить часть значений
|
|||
|---|---|---|---|
|
#18+
ПрограмёрТо есть, если я с умом подхожу к ресурсам и предпочитаю создавать цикл стандартным образом (предусмотренным в языке для этого), а не с изворотом, то я не опытный программист? хотите рационально использовать ресурсы? что вы вообще делаете тогда в пхп? для таких как вы есть АСМ, Си... ПрограмёрЯ просто не вижу ни одного преимущества foreach(range(...)) перед обычным for, о чём и сказал. всё очень просто. преимущество в том что с range() нагляднее. сразу виден диапазон значений. ВСЁ! я НИГДЕ не говорил что так нужно делать ВСЕГДА или что это быстрее... всем это очевидно. как оказалось кроме вас. вы узрели в этом тему для холивара и начали доказывать очевидные и банальные вещи которые тут всем известны. я не хуже вас знаю что работает быстрее а что медленнее, и даже знаю почему. когда будет стоять задача сделать быстро, сделаю чтоб работало максимально быстро, когда нужно сделать наглядно и просто(как в теме ТСа) сделаю код именно таким. не смотря на то, что это может задеть чью-то тонкую натуру)) ПрограмёрЯ же не залез в ветку C++ и не стал разводить тему, почему Дэлфи лучше). зато залез в тему про PHP, и начал неуместно доказывать что Python лучше. это тоже самое. не имею ничего простив Python, он мне очень нравится, но все должно быть к месту и в тему, а не как у вас получилось. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.02.2014, 11:44 |
|
||
|
Массив изменить часть значений
|
|||
|---|---|---|---|
|
#18+
r u, Ладно, упустим спор, добром он не кончится Если Вам показалось, что я хочу возвысить питон над пхп, то я имел ввиду совсем другое (хотя признаю, первый мне понравился больше). Ну а по теме... если на производительность (двойной перебор, сначала range, а потом результата этого range) и ресурсоёмкость (снова тот же range) нам наплевать... то может лучше тогда так (?): Код: php 1. тут сразу виден диапазон ключей, заменяемое значение, ну и сама суть (что мы что-то заменяем). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.02.2014, 11:59 |
|
||
|
Массив изменить часть значений
|
|||
|---|---|---|---|
|
#18+
Програмёрто может лучше тогда так лучшее враг хорошего. слышали?) и почему используете range() ? он же вам ненравится своей ресурсоемкостью) дальше: допустим в исходном массиве 1000 элементов, и нам нужно заменить всего 10 из них. - в вашем варианте, идет перебор(внутри array_replace) ВСЕХ 1000 элементов массива, хотя нам нужны всего 10. - в моем варианте (с for() или foreach()) цикл переберет всего 10 допустим нужно заменить значения не на ноль а на другие значения, причем это зависит от индекса текущего элемента - в вашем случае нужно генерить туеву хучу массивов с новыми значениями. можете сами представить как это будет выглядеть в итоге. - в моем случае, какая угодно логика, помещается внутри цикла можете сами придумать еще кучу входных условий, для этой простой задачи... подумать... и понять, что тут нет необходимости что то усложнять. задача элементарна. смущает range()? ну замените его на просто for(). быстро и эффективно. что тут обсуждать то? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.02.2014, 13:22 |
|
||
|
Массив изменить часть значений
|
|||
|---|---|---|---|
|
#18+
r uПрограмёрто может лучше тогда так лучшее враг хорошего. слышали?) и почему используете range() ? он же вам ненравится своей ресурсоемкостью) дальше: допустим в исходном массиве 1000 элементов, и нам нужно заменить всего 10 из них. - в вашем варианте, идет перебор(внутри array_replace) ВСЕХ 1000 элементов массива, хотя нам нужны всего 10. - в моем варианте (с for() или foreach()) цикл переберет всего 10 допустим нужно заменить значения не на ноль а на другие значения, причем это зависит от индекса текущего элемента - в вашем случае нужно генерить туеву хучу массивов с новыми значениями. можете сами представить как это будет выглядеть в итоге. - в моем случае, какая угодно логика, помещается внутри цикла можете сами придумать еще кучу входных условий, для этой простой задачи... подумать... и понять, что тут нет необходимости что то усложнять. задача элементарна. смущает range()? ну замените его на просто for(). быстро и эффективно. что тут обсуждать то? Таак. Зачем перебор 1000 элементов? Если данную функцию так реализовали, то ... да вообще зачем? При входе в функцию создаётся копия массива и потом вызываются foreach каждого последующего массива. Не думаю, что они стали бы перебирать все элементы, имея чёткие данные какие элементы надо заменять. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.02.2014, 14:05 |
|
||
|
Массив изменить часть значений
|
|||
|---|---|---|---|
|
#18+
Не ссорьтесь, горячие финские парни :) лично для меня вопрос исчерпан.. Если нет стандартной фукнции для замены нужного диапазона массива другими значениями, вполне подходят циклы. В этом случае, пусть речь не о изящности, а допустим, о читабельности и удобоваримости кода.. И как раз foreach(range(2,5) as $k) мне по нраву..:) Ресурсозатратность в моем случае не актуальна, т.к. массив не будет превышать 10 элементов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.02.2014, 15:16 |
|
||
|
|

start [/forum/topic.php?fid=23&fpage=93&tid=1463037]: |
0ms |
get settings: |
9ms |
get forum list: |
16ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
40ms |
get topic data: |
13ms |
get forum data: |
3ms |
get page messages: |
66ms |
get tp. blocked users: |
2ms |
| others: | 215ms |
| total: | 370ms |

| 0 / 0 |
