[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Можно ли изменить ключ элемента в массиве?
Страницы: 1, 2
Smoren
В качестве примера:

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
попробуйте так:
PHP
foreach($arr as &$k=>$v)
    if(
$k=='second' && !isset($arr['some_key']))$k='some_key';
Smoren
Nikitian
Это не поможет решить основную задачу. Попробую объяснить проще.

На входе есть:
$arr = array(
'first' => 'value1',
'second' => 'value2',
'third' => 'value3',
)

В результате нужно получить:
$arr = array(
'first' => 'value1',
'some_key' => 'value2',
'third' => 'value3',
)

Последовательность элементов не должна измениться.
Перезаписывать весь массив с учетом изменившегося ключа - не вариант.
Smoren
Нашел функцию array_change_key_case(), которая позволяет изменить регистр букв во всех ключах ассоциативного массива. Мне нужно что-то подобное, но дающее возможность полноценно редактировать отдельно взятый ключ.
Mozzi
Smoren,

Глупая идея конечно но можно сделать так, и от этого никакого профита.

PHP
$arr = array(array('first' => 'value1'), array('second' => 'value1'), array('third' => 'value1'));
$arr[1] = array('some_key' => $arr[1]['second']);
Michael
Mozzi, мне тоже кажется, что использование числового индекса
для упорядочивания элементов - самое то для php. Но может потребовать
переделки алгоритма.
Smoren, array_change_key_case() - в том то и дело, что меняет во всех, т.е опять же полный проход с помощью итераций.

_____________
There never was a struggle in the soul of a good man that was not hard
sergeiss
Предлагаю алгоритм:
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, вёрстке. Интерактивно и качественно. За разумные деньги.

* "накапливаю умение телепатии" (С) и "гуглю за ваш счет" (С)

user posted image
glock18
Цитата
Выбираем все элементы массива и их ключи в 2 "параллельных" массива. Просто идем по массиву циклом foreach и создаем эти 2 новых массива.


тогда уж проще array_keys и array_values smile.gif
sergeiss
Цитата (glock18 @ 2.10.2009 - 14:35)
тогда уж проще array_keys и array_values

Визуально (в коде) может и проще. Но вот ты подумай: как они, эти функции, получат результат? Да точно также! Пройдутся в цикле по массиву, извлекут нужные данные, и вернут их в качестве массива.
А если мы сами организуем цикл, то он будет только один! А не два, как в случае с этими функциями (по одному на каждую функцию).

Короче говоря smile.gif Кода примерно столько же напишем, а работать он должен быстрее. Хотя бы на чуть-чуть, но быстрее.

PS.
Цитата (Smoren @ 2.10.2009 - 11:28)
массив $arr очень большой и перезаписывать его весь - неразумная трата времени и ресурсов сервера

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

_____________
* Хэлп по PHP
* Описалово по JavaScript
* Хэлп и СУБД для PostgreSQL

* Обучаю PHP, JS, вёрстке. Интерактивно и качественно. За разумные деньги.

* "накапливаю умение телепатии" (С) и "гуглю за ваш счет" (С)

user posted image
Michael
sergeiss, но у ТС же:
Цитата (Smoren)
массив $arr очень большой и перезаписывать его весь - неразумная трата времени и ресурсов сервера.


_____________
There never was a struggle in the soul of a good man that was not hard
sergeiss
Michael - я как раз сделал приписку к своему посту, пока ты тоже писал smile.gif

Если поставленная задача не имеет решения, то надо ее переформулировать так, чтобы у нее было решение. А для этого надо знать, с какой целью меняется ключ массива.
И опять же - что значит "очень большой"?

_____________
* Хэлп по PHP
* Описалово по JavaScript
* Хэлп и СУБД для PostgreSQL

* Обучаю PHP, JS, вёрстке. Интерактивно и качественно. За разумные деньги.

* "накапливаю умение телепатии" (С) и "гуглю за ваш счет" (С)

user posted image
Michael
Цитата (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
Michael или ТС - напишите предложение разработчикам ПХП smile.gif Если такая фича будет полезна, то ее включат в какую-нибудь следующую версию.


_____________
* Хэлп по PHP
* Описалово по JavaScript
* Хэлп и СУБД для PostgreSQL

* Обучаю PHP, JS, вёрстке. Интерактивно и качественно. За разумные деньги.

* "накапливаю умение телепатии" (С) и "гуглю за ваш счет" (С)

user posted image
Sylex
через ..опу сформулированные задачи тянут за собой соответствующие решения

Smoren
возможно проще можно сделать как-то по другому, можете озвучить задачу полностью? А также объем данных массива, чтобы хоть примерно было ясно, что идет, а что нет

_____________
Я думал я буду сеять добро, но у меня не получилось. Во-первых, мне помешали, во-вторых я сам отрекся от этой идеи.
Guest
$arr['newkey'] = $arr['oldkey'];
unset($arr['oldkey']);
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.