powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / PHP - поменять ключ в массиве
25 сообщений из 35, страница 1 из 2
PHP - поменять ключ в массиве
    #39755127
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно ли в существующем массиве изменить ключ элемента?
Такое разумеется не сработало:
Код: php
1.
2.
3.
4.
5.
6.
7.
$k = '123';
$v = &$k;
$a = [$v=>&$v];
print_r([$k,$v,$a]);

$k = '321';
print_r([$k,$v,$a]);


Ну а [&$v=>&$v] не компилируется.
Есть какие-нибудь обходные способы?
Пока что наиболее близкое получилось такое:
Код: php
1.
2.
3.
4.
5.
$new = '321';
$old = '123';
$a[$new] = &$a[$old];
unset($a[$old]);
print_r([$k,$v,$a]);
...
Рейтинг: 0 / 0
PHP - поменять ключ в массиве
    #39755242
Фотография Karbafos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
зачем?
...
Рейтинг: 0 / 0
PHP - поменять ключ в массиве
    #39755246
Фотография полудух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: php
1.
2.
$map['newkey'] = $map['oldkey'];
unset($map['oldkey']);



в компах нет никакой "магии"
всё есть "последовательность байтов" (из 0/1), а на нижнем уровне просто набор инструкций - куда чего в памяти переместить/посчитать
...
Рейтинг: 0 / 0
PHP - поменять ключ в массиве
    #39755253
Фотография Hett
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
полудух,

ТС такой же вариант написал, и даже лучше.
...
Рейтинг: 0 / 0
PHP - поменять ключ в массиве
    #39755254
Фотография полудух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hettполудух,

ТС такой же вариант написал, и даже лучше.
это?
автор
Код: php
1.
2.
$a[$new] = &$a[$old];
unset($a[$old]);


рановато вы праздновать начали
...
Рейтинг: 0 / 0
PHP - поменять ключ в массиве
    #39755255
Фотография полудух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
или это: $a = [$v=>&$v];


зы: а ещё у него в 2 раза больше строк
...
Рейтинг: 0 / 0
PHP - поменять ключ в массиве
    #39755302
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
полудух
Код: php
1.
2.
$map['newkey'] = $map['oldkey'];
unset($map['oldkey']);



Так себе решение.
Такой способ очевиден, он далеко не лучший.
...
Рейтинг: 0 / 0
PHP - поменять ключ в массиве
    #39755306
vkle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alibek B.он далеко не лучшийВ каком отношении не лучший и почему, что конкретно в этом способе плохо?
...
Рейтинг: 0 / 0
PHP - поменять ключ в массиве
    #39755319
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а) Не сохраняет порядок элементов.
б) Копирует элемент массива вместо копирования ссылки на элемент.
...
Рейтинг: 0 / 0
PHP - поменять ключ в массиве
    #39755320
Фотография полудух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вы удаляете этот элемент, какая ещё ссылка
...
Рейтинг: 0 / 0
PHP - поменять ключ в массиве
    #39755324
vkle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alibek B.,

а) Ну дык порядок и не должен сохраняться при такой операции. Об этом где-то в инструкции по PHP сказано. Другой вопрос, если такое поведение PHP, как изменение порядка элементов, не подходит для конкретной Вашей задачи . Тут уж, звиняйте. Но оно никак не отвечает на вопрос о том, что плохо в этом способе или что хорошо.

б) Об этом (клонирование или дублирование фрагмента памяти, содержащего данные) где-то явно сказано или Вы смотрели исходники PHP в части манипуляций с элементами массива?
...
Рейтинг: 0 / 0
PHP - поменять ключ в массиве
    #39755328
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
полудухвы удаляете этот элемент, какая ещё ссылка
Это заблуждение.
unset не удаляет содержимое элемента.
...
Рейтинг: 0 / 0
PHP - поменять ключ в массиве
    #39755329
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vkleОб этом (клонирование или дублирование фрагмента памяти, содержащего данные) где-то явно сказано
http://php.net/manual/ru/language.references.whatdo.php
...
Рейтинг: 0 / 0
PHP - поменять ключ в массиве
    #39755331
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vkleНо оно никак не отвечает на вопрос о том, что плохо в этом способе или что хорошо.
Мне - отвечает.
Вопрос был в том, как поменять ключ.
При чистом изменении ключа сам массив меняться не должен, равно как порядок элементов.
...
Рейтинг: 0 / 0
PHP - поменять ключ в массиве
    #39755334
vkle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alibek B.vkleОб этом (клонирование или дублирование фрагмента памяти, содержащего данные) где-то явно сказано
http://php.net/manual/ru/language.references.whatdo.php При чем тут ссылки то? Хотя, если хотите использовать ссылки, то там как раз сказано: обе переменные указывают на одни и те же данные и никакого копирования не происходит
Однако, раз уж говорим тут о присваивании вида $b = $a , то для скалярных переменных - в мануале смотрите тут http://php.net/manual/ru/features.gc.refcounting-basics.php Пример #3 . Таки ссылка добавляется.
Для объектов происходит присваивание по ссылке, об этом явно сказано тут: http://php.net/manual/ru/language.operators.assignment.php
Таким образом, насчет копирования Вы ошибаетесь в любом случае.

Alibek B.При чистом изменении ключа сам массив меняться не должен, равно как порядок элементов.Вполне возможно, если в ЯП присутствует функция, которая именно так работает. Но, увы. Несмотря на довольно обширный набор функций PHP для работы с массивами http://php.net/manual/ru/book.array.php
...
Рейтинг: 0 / 0
PHP - поменять ключ в массиве
    #39755344
Фотография полудух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alibek B.полудухвы удаляете этот элемент, какая ещё ссылка
Это заблуждение.
unset не удаляет содержимое элемента.
http://fi2.php.net/manual/ru/function.unset.php
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
Пример #1 Пример использования unset()

<?php
// удаляем одну переменную
unset($foo);

// удаляем один элемент массива
unset($bar['quux']);

// удаляем несколько переменных
unset($foo1, $foo2, $foo3);
?>


// удаляем один элемент массива
...
Рейтинг: 0 / 0
PHP - поменять ключ в массиве
    #39755345
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Заблуждение не перестает быть таковым, независимо от количества повторений.

Код: php
1.
2.
3.
4.
5.
6.
7.
8.
$lazarus = ['a'=>['melchior', 'balthasar', 'casper']];
print_r(['before',$lazarus]);
$undead = &$lazarus['a'];
unset($lazarus['a']);
$undead[] = 'wonder';
print_r(['dead',$lazarus]);
$lazarus['b'] = $undead;
print_r(['raising',$lazarus]);


Посоветую читать англоязычную документацию.
И посмотреть в словарях значения слов remove и destroy.
...
Рейтинг: 0 / 0
PHP - поменять ключ в массиве
    #39755352
vkle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
полудухAlibek B.пропущено...

Это заблуждение.
unset не удаляет содержимое элемента.
http://fi2.php.net/manual/ru/function.unset.php
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
Пример #1 Пример использования unset()

<?php
// удаляем одну переменную
unset($foo);

// удаляем один элемент массива
unset($bar['quux']);

// удаляем несколько переменных
unset($foo1, $foo2, $foo3);
?>



// удаляем один элемент массива Ну, с Новым годом!
Элемент массива (ссылка на область памяти, где хранится значение) и содержимое элемента массива (область памяти, выделенная для хранения значения) совсем не одно и то же. Вы можете удалить элемент из массива или удалить переменную, но очисткой памяти от неиспользуемых данных занимается механизм Garbage Collection, он же сборщик мусора. Если он включен, конечно.
...
Рейтинг: 0 / 0
PHP - поменять ключ в массиве
    #39755355
Фотография полудух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alibek B.Заблуждение не перестает быть таковым, независимо от количества повторений.

Код: php
1.
2.
3.
4.
5.
6.
7.
8.
$lazarus = ['a'=>['melchior', 'balthasar', 'casper']];
print_r(['before',$lazarus]);
$undead = &$lazarus['a'];
unset($lazarus['a']);
$undead[] = 'wonder';
print_r(['dead',$lazarus]);
$lazarus['b'] = $undead;
print_r(['raising',$lazarus]);



Посоветую читать англоязычную документацию.
И посмотреть в словарях значения слов remove и destroy.
вы укуренный чтоли там ещё в добавок

нахрена вы копируете $lazarus['a'] в отдельную переменную,
а затем эту переменную ставите в $lazarus['b] ?!?
и вуаля - ФОКУС ГОТОВ!

при этом $lazarus['a'] там, как и положено, благополучно удалён unset-ом


зы: и можете даже ссылку убрать - эффект тот же.

vkleНу, с Новым годом!
Элемент массива (ссылка на область памяти, где хранится значение) и содержимое элемента массива (область памяти, выделенная для хранения значения) совсем не одно и то же. Вы можете удалить элемент из массива или удалить переменную, но очисткой памяти от неиспользуемых данных занимается механизм Garbage Collection, он же сборщик мусора. Если он включен, конечно.
угу, счастья, здоровья...
а вдруг прогер внезапно пишет на C++ и САМ удаляет всё за собой?


в пхп таки есть ГЦ, но это неважно
Удалён он там физически или ждём ГЦ, а в массиве его уже нет после unset().
...
Рейтинг: 0 / 0
PHP - поменять ключ в массиве
    #39755356
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
полудухзы: и можете даже ссылку убрать - эффект тот же.
Смешной ты и необразованный.
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
$a1 = ['a'=>[1,2,3]];
$a2 = ['a'=>[11,22,33]];
$r1 = $a1['a'];
$r2 = &$a1['a'];
$a1['a'][] = 999;
$a2['a'][] = 999;
unset($a1['a'],$a2['a']);
$a1['b'] = $r1;
$a2['b'] = $r2;
unset($r1,$r2);
print_r([$a1,$a2]);


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
Array
(
    [0] => Array
        (
            [b] => Array
                (
                    [0] => 1
                    [1] => 2
                    [2] => 3
                )

        )

    [1] => Array
        (
            [b] => Array
                (
                    [0] => 1
                    [1] => 2
                    [2] => 3
                    [3] => 999
                )

        )

)
...
Рейтинг: 0 / 0
PHP - поменять ключ в массиве
    #39755366
Дормедонт Евлампиевич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: php
1.
2.
3.
4.
5.
6.
7.
function array_change_key(&$array, $src, $dst)
{
    $keys = array_keys($array);
    $i = array_flip($keys)[$src];
    $keys[$i] = $dst;
    $array = array_combine($keys, $array);
}



Alibek B., я думаю, Вы бы и самостоятельно додумались до такого грубого решения. Но если так, почему такие вопросы?
...
Рейтинг: 0 / 0
PHP - поменять ключ в массиве
    #39755367
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не до такого, как вариант с сохранением порядка элементов я думал использовать range с последующим combine.
Но и это опять же не замена ключа в массиве, а формирование нового массива.
Мне интересно именно изменить ключ. Может быть есть такой способ, просто я его не знаю, так как PHP я использую от случая к случаю и утилитарно.
...
Рейтинг: 0 / 0
PHP - поменять ключ в массиве
    #39755369
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что касается задачи, то я пишу скрипт-сервис (работающий как демон), который взаимодействует с внешней системой.
В этом скрипте есть вспомогательный справочник (массив), используемый для быстрого поиска данных пользователей по номеру телефона (номер телефона - ключ). Но в информационной системе у пользователей номер телефона может меняться и в этом случай справочник нужно обновить. При этом по определенным причинам хотелось бы сохранить порядок элементов в справочнике.
...
Рейтинг: 0 / 0
PHP - поменять ключ в массиве
    #39755382
Фотография полудух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alibek B.полудухзы: и можете даже ссылку убрать - эффект тот же.
Смешной ты и необразованный.
а ты тупой, как воробушек.
в примере опят unset() отработал именно так, как и должен был

а именно - удалил элементы массива.
надежды на то, что он сотрёт r2 вместе со ссылкой опять же подчёркивают полную безграмотность вопрошающего юнца (даже если допустить, что вместо &$a1 там &$a2)
очень хочется верить, что эти "гениальные" примеры перерастут во что-то стоящее ДО следующего нового года.

Alibek B.Что касается задачи, то я пишу скрипт-сервис (работающий как демон), который взаимодействует с внешней системой.
В этом скрипте есть вспомогательный справочник (массив), используемый для быстрого поиска данных пользователей по номеру телефона (номер телефона - ключ). Но в информационной системе у пользователей номер телефона может меняться и в этом случай справочник нужно обновить. При этом по определенным причинам хотелось бы сохранить порядок элементов в справочнике.
потому что БД лишний раз дёргать не хочется
ты ещё и коллега, студент

причина тут одна - неопытный дурачок кастует самому себе (и людям, что гораздо важнее) палки в колёсах
парсеры иди пиши, а не ИФ, твоя архитектура - говно.
Модератор: За своими словами следите, пожалуйста.
...
Рейтинг: 0 / 0
PHP - поменять ключ в массиве
    #39755385
Фотография Karbafos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alibek B.Что касается задачи, то я пишу скрипт-сервис (работающий как демон), который взаимодействует с внешней системой.
В этом скрипте есть вспомогательный справочник (массив), используемый для быстрого поиска данных пользователей по номеру телефона (номер телефона - ключ). Но в информационной системе у пользователей номер телефона может меняться и в этом случай справочник нужно обновить. При этом по определенным причинам хотелось бы сохранить порядок элементов в справочнике.

Ты не можешь сохранить порядок элементов в хэше, никак, это как запрос select из базы без order by, порядок не гарантируется.
Тем более, что при перестроении списка ключей связи меняются.
Поиск по ключу хеша это O(1), ему пофиг на порядок, он итак быстрый.

Сравни вывод для
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
<?php

$a = [
    '012' => '012',
    '123' => '123',
    '456' => '456'
];

$new = '321';
$old = '123';
$a[$new] = &$a[$old];
unset($a[$old]);

print_r($a);



и

Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
<?php

$a = [
    '012' => '012',
    '123' => '123',
    '456' => '456'
];

$new = '321';
$old = '123';
$a[$new] = $a[$old];
unset($a[$old]);

print_r($a);



Они идентичны.

Не нужно без повода использовать &

Вот пример опкодов для

$a[$new] = &$a[$old];
Код: plaintext
1.
2.
3.
4.
5.
6.
line     #* E I O op                           fetch          ext  return  operands
-------------------------------------------------------------------------------------
  11     3        FETCH_DIM_W                                      $7      !0, !2
         4        MAKE_REF                                         $8      $7
         5        FETCH_DIM_W                                      $6      !0, !1
         6        ASSIGN_REF                                               $6, $8

и

$a[$new] = $a[$old];
Код: plaintext
1.
2.
3.
4.
5.
line     #* E I O op                           fetch          ext  return  operands
-------------------------------------------------------------------------------------
  11     3        FETCH_DIM_R                                      $7      !0, !2
         4        ASSIGN_DIM                                               !0, !1
         5        OP_DATA                                                  $7

Второй более оптимален в таком варианте.
...
Рейтинг: 0 / 0
25 сообщений из 35, страница 1 из 2
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / PHP - поменять ключ в массиве
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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