Замена элемента массива

Falc

Новичок
Замена элемента массива

Есть елемент массива x с ключом a, его нужно заменить на элемент y с ключом b. (Под заменить подрузумеватся вставить на тоже порядковое место).

Вопрос: возможно ли это сделать без прохода циклом по массиву?
 

MD

Guest
по-моему без цикла никак.


Positive, вопрос риторический: ты уверен, что понял вопрос? :)
 

Falc

Новичок
Positive
Я видимо не совсем корректно написал вопрос, имелось в виду, что новый элемент должен получить ключ b, т.е. сделать следующее, но с сохранением порядквого номера элемента:
PHP:
unset($array['a']);
$array['b'] = $y;
 

zerkms

TDD infected
Команда форума
имхо, если массив ассоциативный (суть хэш) в нём порядка не должно быть по определению, а если с числовыми индексами (суть упорядоченный) - то всё понятно.
 

Фанат

oncle terrible
Команда форума
zerkms
а по-моему, как раз для числового порядок не столь важен.
а вот чтобы ассоциативный в определённом порядке перебрать - только порядок следования элементов и остаётся.
 

Falc

Новичок
zerkms
>>имхо, если массив ассоциативный (суть хэш) в нём порядка не должно быть по определению

Не понятно откуда такое определение?

Массив может содержать упорядоченные данные.
 

ybilevych

Новичок
Если правильно понял, то требуется заменить и ключ и значение определенного элемента массива...

В правильности не уверен, но может где-то так:
1. Получить ключи массива ([m]array_keys[/m])
2. Получить порядковый номер нужного ключа([m]array_search[/m])
3. Заменить ключ с найденным порядковым номером (пункт 2)
4. Получить значения массива ([m]array_values[/m])
5. Заменить значение с найденным порядковым номером (пункт 2)
6. Объединить ключи и значения ([m]array_combine[/m])
 

zerkms

TDD infected
Команда форума
Фанат
он не важен, но он подразумевает возможность использования некоего правила (порядок следования ключей) для восстановления/изменения порядка следования элементов
в то время как в ассоциативных массивах такого нет, и никто почему то не говорит что тредстартер "не должен этого хотеть" (с)

опять же, я думаю, что для выборки данных из БД (mysql, например в порядке добавления) ты используешь сортировку явно по id, хотя думаю что запрос без сортировки вернул то же самое
 

Falc

Новичок
ybilevych
>>Если правильно понял, то требуется заменить и ключ и значение определенного элемента массива...
Да, понял правильно.

>>1. Получить ключи массива (array_keys)
>>2. Получить порядковый номер нужного ключа(array_search)
3.[m]array_splice[/m]

Спасибо :)

-~{}~ 11.04.06 14:08:

zerkms
Вот смотри простой пример:
Мы упорядочно вибираем данные из базы в массив, в качестве ключей массива используем первичный ключ из базы, в результате у нас ассоциативный массив в котором важен порядок.
 

zerkms

TDD infected
Команда форума
Falc
а первичный ключ из базы это не id (integer) ли? если нет - то вероятно всё дело - в неверной проектировке базы, и как результат - поиск костыля, имхо
 

zerkms

TDD infected
Команда форума
Фанат
хехе ;) а как же политика - "подсказывать как нужно делать, вместо - делать чтобы работало хоть как-нибудь" ?? налицо проблемы с бд, а эта подпорка (см. выше алгоритм) потом ещё неоднократно даст о себе знать
 

Фанат

oncle terrible
Команда форума
zerkms
с чего ты взял, что у него проблема с бд?

Falc
а опиши, правда, проблему?
может быть, твоё решение с заменой элемента - не самое оптимальное?
нафига ключ-то менять, к примеру?
 

Falc

Новичок
zerkms
>>налицо проблемы с бд, а эта подпорка (см. выше алгоритм) потом ещё неоднократно даст о себе знать

Да ты просто ясновидящий.
 

zerkms

TDD infected
Команда форума
ps: если так охота реализовать алгоритм, то
PHP:
$srch = array('oldkey' => 'somekey', 'key' => 'newkey', 'value' => 'somevalue');

$res = array();

foreach($arr as $key => $val) {
    if($key == $srch['oldkey']) {
        $res[$srch['key']] => $srch['value'];
    } else {
        $res[$key] = $val;
    }
}
ps: код не проверял

-~{}~ 11.04.06 21:29:

Falc
нужно быть ясновидящим чтобы сказать что примари кей varchar это не совсем удачное решение??
 

Falc

Новичок
Фанат
Ок, опишу проблему. Есть дерево (меню), если у некого элемента есть только 1 чилд то этот чилд должен встать на место родителя.

-~{}~ 11.04.06 14:31:

zerkms
Ты вопрос в первом посте вообще читал?
 

Фанат

oncle terrible
Команда форума
zerkms
с чего ты взял, что у него варчар?
чем, по-твоему, отличается array (5=>'value') от array('key'=>'value')?
 

zerkms

TDD infected
Команда форума
Есть дерево (меню), если у некого элемента есть только 1 чилд то этот чилд должен встать на место родителя.
именно для этого пункты меню помещаем в ИНДЕКСИРОВАННЫЙ массив и замена парента на чайлд будет заменой значения значения элемента массива с известным индексом безо всяких колдунств с индексами.

Фанат
Мы упорядочно вибираем данные из базы в массив, в качестве ключей массива используем первичный ключ из базы, в результате у нас ассоциативный массив в котором важен порядок.
если на выходе не получается массив с исключительно числовыми ключами (для которого проблемы не существует) то какой тип поля ещё может быть у него?? (исключая совсем невероятные date, enum,...)
 
Сверху