powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / Массив изменить часть значений
17 сообщений из 17, страница 1 из 1
Массив изменить часть значений
    #38559286
AlexSes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем доброго дня.
Есть ли что-нибудь изящней, чем перебор массива в цикле для смены определенной части значений?
Поясню:
массив значений array (0,1,2,2,2,1);
мне нужно к примеру, с индекса 2 по 5 изменить значения на 0.
Спасибо.
...
Рейтинг: 0 / 0
Массив изменить часть значений
    #38559291
Фотография r u
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlexSes,
именно такой функции нет. чтоб меняла именно с 2 по 5 элемент массива.
весь массив тоже нет необходимости перебирать, достаточно пробежаться по нужным индексам, типа
Код: php
1.
2.
3.
4.
$a = array(0,1,2,2,2,1);
foreach(range(2,5) as $k) {
 $a[$k]=0;
}
...
Рейтинг: 0 / 0
Массив изменить часть значений
    #38559298
AlexSes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо. Ваш пример выглядит симпатичней, но тоже цикл:)
Да, и весь массив у меня не будет перебираться, потому что старт-индекс задается заранее.
я, правда сделал по-пролетраски:
Код: php
1.
2.
3.
for($i=$startindex; $i<=$endindex; $i++) {
 $a[$i]=0;
}


Жаль аналога array_fill() для подобной задачи нет..
Хотя.. если поизвращаться, то можно и функциями array_slice() и array_fill() + слияние 2-х массивов сделать.. Но изящности, имхо, в этом мало..
...
Рейтинг: 0 / 0
Массив изменить часть значений
    #38559528
Фотография r u
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlexSesХотя.. если поизвращаться, то можно и функциями array_slice() и array_fill() + слияние 2-х массивов сделать.. Но изящности, имхо, в этом мало..
слиянием не получится.
array_merge: ... если массивы имеют одинаковые числовые ключи, значение, упомянутое последним, не заменит исходное значение, а будет добавлено в конец массива.
если только слияние вручную делать. но это еще хуже.
...
Рейтинг: 0 / 0
Массив изменить часть значений
    #38559667
Програмёр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlexSesСпасибо. Ваш пример выглядит симпатичней, но тоже цикл:)
Да, и весь массив у меня не будет перебираться, потому что старт-индекс задается заранее.
я, правда сделал по-пролетраски:
Код: php
1.
2.
3.
for($i=$startindex; $i<=$endindex; $i++) {
 $a[$i]=0;
}


Жаль аналога array_fill() для подобной задачи нет..
Хотя.. если поизвращаться, то можно и функциями array_slice() и array_fill() + слияние 2-х массивов сделать.. Но изящности, имхо, в этом мало..

А какая разница кто перебор запустит, Вы или сам интерпретатор? По сути, если надо заменить часть значений в массиве, значит или их перебором поменять, или подменить часть массива другим массивом. Второй метод точно также потребует перебора для создания массива, так как заранее количество заменяемых элементов не известно
...
Рейтинг: 0 / 0
Массив изменить часть значений
    #38560574
AlexSes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
> Програмёр
Ну, это понятно конечно, просто код у r u в ответе выглядит изящней, чем мой - с инкрименирующей переменной i :).
> r u
а почему слиянием не получится?
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
###
$ar_old= array (1,2,3,4,5,6);
$ar_new1= array_slice($ar_old, 0, 3);
$ar_new2=array_fill(3,3,0);
$a=$ar_new1+$ar_new2;
foreach($a as $row) {
  print_r($row);
}
...
Рейтинг: 0 / 0
Массив изменить часть значений
    #38560585
Фотография r u
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlexSes,

в целом получится, но не сразу)) в вашем примере этого не видно, а вот так:
Код: php
1.
2.
3.
4.
5.
$ar_new1 = array(1=>1,2,3);    //      1=>1,2=>2,3=>3,
$ar_new2 = array(0=>0,4=>0,0); // 0=>0,               4=>0,5=>0
$a = $ar_new1+$ar_new2;
ecoh '<pre>';
print_r($a); // keys: 1,2,3,0,4,5


обратите внимание на ключи результирующего массива. требуется сортировка

в общем очень громоздко получается. в качестве работчего варинта негодится, учитывая что есть боле простые и быстрые варианты
...
Рейтинг: 0 / 0
Массив изменить часть значений
    #38560612
AlexSes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ну, в вашем примере действительно, массив требует сортировки.
В продолжение моего примера с объединением, если оперировать с $a[$i], то как бы, всё на своем месте:)
В любом случае, конструкция с вышеприведенными функциями выглядит действительно громоздко, что, наверное, не отвечает первоначальной задачи - изящности.
...
Рейтинг: 0 / 0
Массив изменить часть значений
    #38561176
Програмёр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlexSes > Програмёр
Ну, это понятно конечно, просто код у r u в ответе выглядит изящней, чем мой - с инкрименирующей переменной i :).

А в чём изящней? Я бы согласился, если бы разговор касался питона (хотя там есть методы и удобнее, там просто срезы продуманы лучше чем в пхп, там можно один срез заменить другим срезом или массивом).
Однако, не забываем, что в питоне range - это генератор, а в пхп генераторов нету, потому возвращается массив :) Не большое, но всё же лишнее потребление памяти.

Потому лично я считаю метод с обычным for самым оптимальным в данной ситуации.

Вот это я понимаю изящество :)
Код: python
1.
2.
3.
4.
5.
6.
7.
#ну, можно и без функции, просто решил выделить для наглядности
def fillValues(arr, start, end, val):
  arr[start:end]=[val]*(end-start)

arr = [0, 1, 2, 2, 2, 1]
fillValues(arr, 2, 4, 0) # ну а вот так используем
print arr



Я новичёк в питоне... так что уверен, что это не предел изящества :) (срезы - великая сила... очень удобно, учитывая. что есть параметр step позволяющий обрабатывать не каждый элемент)
...
Рейтинг: 0 / 0
Массив изменить часть значений
    #38562604
Фотография r u
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Програмёресли бы разговор касался питона
причем здесь питон... к чему эта попытка создать холивар на пустом месте? используйте хоть do{}while() если хотите. тоже можно. и может даже быстрее. кто измерял?)

ПрограмёрНе большое, но всё же лишнее потребление памяти.
еще предложите echo вместо print, и преинкремент вместо постинкремента... сразу видно что опыта в программировании мало, борьба с придуманными ветрянными мельницами. это пройдет, но не сразу )
...
Рейтинг: 0 / 0
Массив изменить часть значений
    #38562713
Програмёр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
r uПрограмёресли бы разговор касался питона
причем здесь питон... к чему эта попытка создать холивар на пустом месте? используйте хоть do{}while() если хотите. тоже можно. и может даже быстрее. кто измерял?)

ПрограмёрНе большое, но всё же лишнее потребление памяти.
еще предложите echo вместо print, и преинкремент вместо постинкремента... сразу видно что опыта в программировании мало, борьба с придуманными ветрянными мельницами. это пройдет, но не сразу )

Мало - это сколько? :)
То есть, если я с умом подхожу к ресурсам и предпочитаю создавать цикл стандартным образом (предусмотренным в языке для этого), а не с изворотом, то я не опытный программист?

Я просто не вижу ни одного преимущества foreach(range(...)) перед обычным for, о чём и сказал.

Про питон... Ну автор же искал изящество, я показал как вижу это в идеале (раздел не запрещает вести общение про питон. Я же не залез в ветку C++ и не стал разводить тему, почему Дэлфи лучше).
...
Рейтинг: 0 / 0
Массив изменить часть значений
    #38562762
anvano
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно еще по-другому заставить интерпретатор перебор сделать :)

Код: php
1.
2.
$a = array(0,1,2,2,2,1);
array_walk($a, function(&$n,$k) { $n = ($k >=2 && $k<=5) ? 0 : $n;}); 




Но коллеги в будущем вас за такой код угробят, ибо для поставленной задачи - цикл - самоочевидное решение, даже не требующее комментариев в коде.
...
Рейтинг: 0 / 0
Массив изменить часть значений
    #38562778
Фотография r u
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ПрограмёрТо есть, если я с умом подхожу к ресурсам и предпочитаю создавать цикл стандартным образом (предусмотренным в языке для этого), а не с изворотом, то я не опытный программист?
хотите рационально использовать ресурсы? что вы вообще делаете тогда в пхп? для таких как вы есть АСМ, Си...

ПрограмёрЯ просто не вижу ни одного преимущества foreach(range(...)) перед обычным for, о чём и сказал.
всё очень просто. преимущество в том что с range() нагляднее. сразу виден диапазон значений. ВСЁ! я НИГДЕ не говорил что так нужно делать ВСЕГДА или что это быстрее... всем это очевидно. как оказалось кроме вас. вы узрели в этом тему для холивара и начали доказывать очевидные и банальные вещи которые тут всем известны. я не хуже вас знаю что работает быстрее а что медленнее, и даже знаю почему. когда будет стоять задача сделать быстро, сделаю чтоб работало максимально быстро, когда нужно сделать наглядно и просто(как в теме ТСа) сделаю код именно таким. не смотря на то, что это может задеть чью-то тонкую натуру))

ПрограмёрЯ же не залез в ветку C++ и не стал разводить тему, почему Дэлфи лучше).
зато залез в тему про PHP, и начал неуместно доказывать что Python лучше. это тоже самое.
не имею ничего простив Python, он мне очень нравится, но все должно быть к месту и в тему, а не как у вас получилось.
...
Рейтинг: 0 / 0
Массив изменить часть значений
    #38562793
Програмёр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
r u,

Ладно, упустим спор, добром он не кончится

Если Вам показалось, что я хочу возвысить питон над пхп, то я имел ввиду совсем другое (хотя признаю, первый мне понравился больше).

Ну а по теме... если на производительность (двойной перебор, сначала range, а потом результата этого range) и ресурсоёмкость (снова тот же range) нам наплевать... то может лучше тогда так (?):
Код: php
1.
$arr = array_replace($arr, array_fill_keys(range(2, 5), 0));



тут сразу виден диапазон ключей, заменяемое значение, ну и сама суть (что мы что-то заменяем).
...
Рейтинг: 0 / 0
Массив изменить часть значений
    #38562894
Фотография r u
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Програмёрто может лучше тогда так
лучшее враг хорошего. слышали?)

и почему используете range() ? он же вам ненравится своей ресурсоемкостью)

дальше:
допустим в исходном массиве 1000 элементов, и нам нужно заменить всего 10 из них.
- в вашем варианте, идет перебор(внутри array_replace) ВСЕХ 1000 элементов массива, хотя нам нужны всего 10.
- в моем варианте (с for() или foreach()) цикл переберет всего 10

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

можете сами придумать еще кучу входных условий, для этой простой задачи... подумать... и понять, что тут нет необходимости что то усложнять. задача элементарна. смущает range()? ну замените его на просто for(). быстро и эффективно. что тут обсуждать то?
...
Рейтинг: 0 / 0
Массив изменить часть значений
    #38562990
Програмёр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
r uПрограмёрто может лучше тогда так
лучшее враг хорошего. слышали?)

и почему используете range() ? он же вам ненравится своей ресурсоемкостью)

дальше:
допустим в исходном массиве 1000 элементов, и нам нужно заменить всего 10 из них.
- в вашем варианте, идет перебор(внутри array_replace) ВСЕХ 1000 элементов массива, хотя нам нужны всего 10.
- в моем варианте (с for() или foreach()) цикл переберет всего 10

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

можете сами придумать еще кучу входных условий, для этой простой задачи... подумать... и понять, что тут нет необходимости что то усложнять. задача элементарна. смущает range()? ну замените его на просто for(). быстро и эффективно. что тут обсуждать то?

Таак. Зачем перебор 1000 элементов? Если данную функцию так реализовали, то ... да вообще зачем? При входе в функцию создаётся копия массива и потом вызываются foreach каждого последующего массива. Не думаю, что они стали бы перебирать все элементы, имея чёткие данные какие элементы надо заменять.
...
Рейтинг: 0 / 0
Массив изменить часть значений
    #38563128
AlexSes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Не ссорьтесь, горячие финские парни :)
лично для меня вопрос исчерпан..
Если нет стандартной фукнции для замены нужного диапазона массива другими значениями, вполне подходят циклы. В этом случае, пусть речь не о изящности, а допустим, о читабельности и удобоваримости кода.. И как раз foreach(range(2,5) as $k) мне по нраву..:)
Ресурсозатратность в моем случае не актуальна, т.к. массив не будет превышать 10 элементов.
...
Рейтинг: 0 / 0
17 сообщений из 17, страница 1 из 1
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / Массив изменить часть значений
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]