В качестве примера:
PHP |
$arr = array( 'first' => 'value1', 'second' => 'value2', 'third' => 'value3', ... 'infinity' => 'valueN', ) |
Предположим, нужно ключ 'second' поменять на 'some_key', при этом не нарушив последовательность элементов в массиве.
Следующий способ не покатит, так как массив $arr очень большой и перезаписывать его весь - неразумная трата времени и ресурсов сервера.
PHP |
foreach($arr as $k => $v) { if($k === 'second') $k = 'some_key'; $arr1[$k] = $v; }
$arr = $arr1; |
Заранее благодарен за помощь.
Nikitian
2.10.2009 - 11:31
попробуйте так:
PHP |
foreach($arr as &$k=>$v) if($k=='second' && !isset($arr['some_key']))$k='some_key'; |
Nikitian
Это не поможет решить основную задачу. Попробую объяснить проще.
На входе есть:
$arr = array(
'first' => 'value1',
'second' => 'value2',
'third' => 'value3',
)
В результате нужно получить:
$arr = array(
'first' => 'value1',
'some_key' => 'value2',
'third' => 'value3',
)
Последовательность элементов не должна измениться.
Перезаписывать весь массив с учетом изменившегося ключа - не вариант.
Нашел функцию array_change_key_case(), которая позволяет изменить регистр букв во всех ключах ассоциативного массива. Мне нужно что-то подобное, но дающее возможность полноценно редактировать отдельно взятый ключ.
Smoren,
Глупая идея конечно но можно сделать так, и от этого никакого профита.
PHP |
$arr = array(array('first' => 'value1'), array('second' => 'value1'), array('third' => 'value1')); $arr[1] = array('some_key' => $arr[1]['second']); |
Michael
2.10.2009 - 12:17
Mozzi, мне тоже кажется, что использование числового индекса
для упорядочивания элементов - самое то для php. Но может потребовать
переделки алгоритма.
Smoren, array_change_key_case() - в том то и дело, что меняет во всех, т.е опять же полный проход с помощью итераций.
_____________
There never was a struggle in the soul of a good man that was not hard
sergeiss
2.10.2009 - 13:39
Предлагаю алгоритм:
1. Выбираем все элементы массива и их ключи в 2 "параллельных" массива. Просто идем по массиву циклом foreach и создаем эти 2 новых массива.
2. Удаляем исходный массив.
3. Меняем нужные элементы и/или ключи. Сделать это на данном этапе легко и просто.
4. Собираем массив заново функцией array_combine:
Код |
array array_combine ( array $keys , array $values ) Возвращает array, используя значения массива keys в качестве ключей и значения масссива values в качестве соответствующих значений.
Возвращает FALSE, если количество элементов в исходных массивах не совпадает или если массивы пусты.
|
_____________
*
Хэлп по PHP*
Описалово по JavaScript *
Хэлп и СУБД для PostgreSQL*
Обучаю PHP, JS, вёрстке. Интерактивно и качественно. За разумные деньги. *
"накапливаю умение телепатии" (С) и "гуглю за ваш счет" (С)
glock18
2.10.2009 - 14:35
Цитата |
Выбираем все элементы массива и их ключи в 2 "параллельных" массива. Просто идем по массиву циклом foreach и создаем эти 2 новых массива. |
тогда уж проще array_keys и array_values
sergeiss
2.10.2009 - 15:24
Цитата (glock18 @ 2.10.2009 - 14:35) |
тогда уж проще array_keys и array_values |
Визуально (в коде) может и проще. Но вот ты подумай: как они, эти функции, получат результат? Да точно также! Пройдутся в цикле по массиву, извлекут нужные данные, и вернут их в качестве массива.
А если мы сами организуем цикл, то он будет только один! А не два, как в случае с этими
функциями (по одному на каждую функцию).
Короче говоря
![smile.gif](http://phpforum.su/html/emoticons/smile.gif)
Кода примерно столько же напишем, а
работать он должен быстрее. Хотя бы на чуть-чуть, но быстрее.
PS.
Цитата (Smoren @ 2.10.2009 - 11:28) |
массив $arr очень большой и перезаписывать его весь - неразумная трата времени и ресурсов сервера |
Может массив и большой, но других способов, кроме как перезаписать массив, я лично не вижу. Может кто другой что подскажет?
И еще. А зачем его менять, этот ключ? Может быть, задачу можно как-то по-другому решить, не меняя ключ этого элемента?
_____________
*
Хэлп по PHP*
Описалово по JavaScript *
Хэлп и СУБД для PostgreSQL*
Обучаю PHP, JS, вёрстке. Интерактивно и качественно. За разумные деньги. *
"накапливаю умение телепатии" (С) и "гуглю за ваш счет" (С)
Michael
2.10.2009 - 15:28
sergeiss, но у ТС же:
Цитата (Smoren) |
массив $arr очень большой и перезаписывать его весь - неразумная трата времени и ресурсов сервера. |
_____________
There never was a struggle in the soul of a good man that was not hard
sergeiss
2.10.2009 - 15:32
Michael - я как раз сделал приписку к своему посту, пока ты тоже писал
![smile.gif](http://phpforum.su/html/emoticons/smile.gif)
Если поставленная задача не имеет решения, то надо ее переформулировать так, чтобы у нее было решение. А для этого надо знать, с какой целью меняется ключ массива.
И опять же - что значит "очень большой"?
_____________
*
Хэлп по PHP*
Описалово по JavaScript *
Хэлп и СУБД для PostgreSQL*
Обучаю PHP, JS, вёрстке. Интерактивно и качественно. За разумные деньги. *
"накапливаю умение телепатии" (С) и "гуглю за ваш счет" (С)
Michael
2.10.2009 - 15:50
Цитата (sergeiss @ 2.10.2009 - 11:32) |
И опять же - что значит "очень большой"? |
Ну миллионов 10 элементов...
Вообще в php когда итерациями проходишь по массиву могли бы сделать
возможность поменять ключик (значение то можно и не ключ же хранит ссылку на следующий элемент).
Если не подходит копировать массив, то для ТС вижу такое решение:
mas[id][key1]=value // ключик спрятан вторым размером массива
mas[1]['first']='value1'
mas[2]['second']='value2'
И дополнительный массив:
mas_dop[key1]=id
избыточный для быстрого поиска id по key1 (индекс)
id наращивается вручную как и добавление, удаление - т.е. придется поработать.
_____________
There never was a struggle in the soul of a good man that was not hard
sergeiss
2.10.2009 - 16:04
Michael или ТС - напишите предложение разработчикам ПХП
![smile.gif](http://phpforum.su/html/emoticons/smile.gif)
Если такая фича будет полезна, то ее включат в какую-нибудь следующую версию.
_____________
*
Хэлп по PHP*
Описалово по JavaScript *
Хэлп и СУБД для PostgreSQL*
Обучаю PHP, JS, вёрстке. Интерактивно и качественно. За разумные деньги. *
"накапливаю умение телепатии" (С) и "гуглю за ваш счет" (С)
через ..опу сформулированные задачи тянут за собой соответствующие решения
Smoren
возможно проще можно сделать как-то по другому, можете озвучить задачу полностью? А также объем данных массива, чтобы хоть примерно было ясно, что идет, а что нет
_____________
Я думал я буду сеять добро, но у меня не получилось. Во-первых, мне помешали, во-вторых я сам отрекся от этой идеи.
$arr['newkey'] = $arr['oldkey'];
unset($arr['oldkey']);
Быстрый ответ:
Powered by dgreen
Здесь расположена полная версия этой страницы.