- В PHP, как вы меняете ключ элемента массива?
- 16 ответов
- Php переименовать ключ array
- Алгоритм замены ключа, имени ключа
- Пример замены ключа в массиве:
- Результат замены ключа в массиве.
- Вывод о замене ключа:
- Замена ключа без изменения положения ключа.
- Замена имени ключа в цикле.
- Замена ключа без изменения положения в массиве:
- Соберем весь код замены ключа на новый:
- Результат вывода замены ключа:
- PHP: Replace an array key.
- Replacing an array key.
- Replacing a key and preserving the order.
В PHP, как вы меняете ключ элемента массива?
У меня есть ассоциативный массив в форме key => value , где ключ — числовое значение, однако это не последовательное числовое значение. Ключ на самом деле является идентификационным номером, а значение — счетчиком. Это нормально для большинства случаев, однако я хочу, чтобы функция получала удобочитаемое имя массива и использовала его для ключа без изменения значения. Я не видел функцию, которая делает это, но я предполагаю, что мне нужно предоставить старый ключ и новый ключ (оба из которых у меня есть) и преобразовать массив. Есть ли эффективный способ сделать это?
16 ответов
$arr[$newkey] = $arr[$oldkey]; unset($arr[$oldkey]);
Только будьте осторожны, что 1) Нет двух ключей, имеющих одинаковую читабельную версию 2) Ни одна из читаемых человеком версий не бывает цифрами
Также это, вероятно, изменит порядок массива, о котором вам, возможно, нужно быть осторожным. Даже ассоциативные массивы в PHP упорядочены, и иногда этот порядок используется.
Да, замечательно, Робин. Есть ли способ сохранить тот же порядок? Или вам нужно создать новый массив для достижения этого?
Я не могу ответить на комментарий к вопросу Петра Пеллера (который хочет изменить ключ, но сохранить порядок массива), потому что моей репутации недостаточно. Я нашел это в . stackoverflow.com/questions/10182684/… может быть полезным 🙂
Существует также проблема, заключающаяся в том, что новый ключ может перезаписать существующий старый ключ и его значения, что приводит к удалению элемента старого ключа из массива. В этом случае вам нужно использовать два массива.
То, как вы это сделаете, и сохранить порядок массива, — это положить ключи массива в отдельный массив, найти и заменить ключ в этом массиве, а затем объединить его со значениями.
Вот функция, которая делает именно это:
function change_key( $array, $old_key, $new_key )
Спасибо, это было действительно полезно, так как мне нужно было сохранить порядок массива. Я уже попробовал принятый ответ, прежде чем нашел эту страницу.
если ваш array построен из запроса базы данных, вы можете напрямую изменить ключ из инструкции mysql :
"select ´id´ **as NEWNAME** from ´tablename´. "
Ответ от KernelM хорош, но для того, чтобы избежать проблемы, поднятой Грегом в комментарии (конфликтующие ключи), использование нового массива было бы безопаснее
$newarr[$newkey] = $oldarr[$oldkey]; $oldarr=$newarr; unset($newarr);
Это хорошее решение, если ваш массив имеет разумный размер. Если ваш массив потребляет более половины доступной памяти PHP, это не будет работать.
@kingjeffrey, не совсем. Значения массива не будут дублироваться, пока они «просто копируются» без изменения. Например, если есть один массив, который содержит 10 000 элементов и использует 40 МБ памяти, его копирование будет занимать память, необходимую для хранения 10 000 ссылок только на уже существующие значения, а не на копии значений , поэтому, если 1 массив использует 40 МБ, его копия может потреблять, может быть, 0,5 МБ (проверено).
Вы можете использовать второй ассоциативный массив, который отображает человеческие читаемые имена в идентификаторы. Это также обеспечило бы отношения «Много к одному». Затем сделайте что-то вроде этого:
echo 'Widgets: ' . $data[$humanreadbleMapping['Widgets']];
Если вы хотите, чтобы позиция нового ключа массива была такой же, как и старая, вы можете сделать это:
function change_array_key( $array, $old_key, $new_key) < if(!is_array($array))< print 'You must enter a array as a haystack!'; exit; >if(!array_key_exists($old_key, $array)) < return $array; >$key_pos = array_search($old_key, array_keys($array)); $arr_before = array_slice($array, 0, $key_pos); $arr_after = array_slice($array, $key_pos + 1); $arr_renamed = array($new_key => $array[$old_key]); return $arr_before + $arr_renamed + $arr_after; >
Мне нравится решение KernelM, но мне нужно что-то, что будет обрабатывать потенциальные конфликты ключей (где новый ключ может соответствовать существующему ключу). Вот что я придумал:
function swapKeys( &$arr, $origKey, $newKey, &$pendingKeys ) < if( !isset( $arr[$newKey] ) ) < $arr[$newKey] = $arr[$origKey]; unset( $arr[$origKey] ); if( isset( $pendingKeys[$origKey] ) ) < // recursion to handle conflicting keys with conflicting keys swapKeys( $arr, $pendingKeys[$origKey], $origKey, $pendingKeys ); unset( $pendingKeys[$origKey] ); >> elseif( $newKey != $origKey ) < $pendingKeys[$newKey] = $origKey; >>
Затем вы можете циклически перемещаться по массиву следующим образом:
$myArray = array( '1970-01-01 00:00:01', '1970-01-01 00:01:00' ); $pendingKeys = array(); foreach( $myArray as $key => $myArrayValue ) < // NOTE: strtotime( '1970-01-01 00:00:01' ) = 1 (a conflicting key) $timestamp = strtotime( $myArrayValue ); swapKeys( $myArray, $key, $timestamp, $pendingKeys ); >// RESULT: $myArray == array( 1=>'1970-01-01 00:00:01', 60=>'1970-01-01 00:01:00' )
Вот вспомогательная функция для достижения этого:
/** * Helper function to rename array keys. */ function _rename_arr_key($oldkey, $newkey, array &$arr) < if (array_key_exists($oldkey, $arr)) < $arr[$newkey] = $arr[$oldkey]; unset($arr[$oldkey]); return TRUE; >else < return FALSE; >>
_rename_arr_key('oldkey', 'newkey', $my_array);
Он вернет true при успешном переименовании, иначе false.
Имейте в виду, что это изменяет порядок массива (элемент переименованного ключа будет находиться в конце массива, а не в той же позиции в массиве, в которой он был изначально). Также я бы обычно не начинал имя функции с подчеркивания (это традиционно используется для обозначения специальных функций внутреннего использования).
Если ваш массив является рекурсивным, вы можете использовать эту функцию: проверьте эти данные:
$datos = array ( '0' => array ( 'no' => 1, 'id_maquina' => 1, 'id_transaccion' => 1276316093, 'ultimo_cambio' => 'asdfsaf', 'fecha_ultimo_mantenimiento' => 1275804000, 'mecanico_ultimo_mantenimiento' =>'asdfas', 'fecha_ultima_reparacion' => 1275804000, 'mecanico_ultima_reparacion' => 'sadfasf', 'fecha_siguiente_mantenimiento' => 1275804000, 'fecha_ultima_falla' => 0, 'total_fallas' => 0, ), '1' => array ( 'no' => 2, 'id_maquina' => 2, 'id_transaccion' => 1276494575, 'ultimo_cambio' => 'xx', 'fecha_ultimo_mantenimiento' => 1275372000, 'mecanico_ultimo_mantenimiento' => 'xx', 'fecha_ultima_reparacion' => 1275458400, 'mecanico_ultima_reparacion' => 'xx', 'fecha_siguiente_mantenimiento' => 1275372000, 'fecha_ultima_falla' => 0, 'total_fallas' => 0, ) );
function changekeyname($array, $newkey, $oldkey) < foreach ($array as $key =>$value) < if (is_array($value)) $array[$key] = changekeyname($value,$newkey,$oldkey); else < $array[$newkey] = $array[$oldkey]; >> unset($array[$oldkey]); return $array; >
эта функция будет принимать целевой хэш $, а $replace также является хешем, содержащим newkey = > ассоциации oldkey.
Эта функция будет сохранять исходный порядок, но может быть проблематичной для очень больших (например, более 10 тыс. записей) массивов в отношении производительности и памяти.
function keyRename(array $hash, array $replacements) < $new=array(); foreach($hash as $k=>$v) < if($ok=array_search($k,$replacements)) $k=$ok; $new[$k]=$v; >return $new; >
эта альтернативная функция будет делать то же самое, с гораздо лучшей производительностью и использованием памяти за счет потери первоначального порядка (что не должно быть проблемой, так как это hashtable!)
function keyRename(array $hash, array $replacements) < foreach($hash as $k=>$v) if($ok=array_search($k,$replacements)) < $hash[$ok]=$v; unset($hash[$k]); >return $hash; >
Php переименовать ключ array
Здесь немного нужно сказать о теории.
Нет такого .. простого способа или функции, которая возьмет и заменит ключ, именно ключ, имя ключа на другое. Просто нет и все.
Поэтому требуется несколько телодвижений.
Алгоритм замены ключа, имени ключа
(далее просто «замена ключа».)
Нам потребуется получить значение ячейки старого ключа, который мы хотим изменить, переименовать. Присвоить новому ключу значение старого ключа.
После того, как новый ключ создан со значением старого ключа . У нас получиться, что есть две ячейки с одинаковыми значениями, но два ключа, «старый ключ» и «новый ключ».
Следующим шагом — мы спокойно можем удалить старый ключ.
Пример замены ключа в массиве:
Для иллюстрации нам понадобится массив:
Выведем прямо здесь с помощью print_r:
Array(
[0] => Ячейка 1 [1] => Ячейка 2 [2] => Ячейка 3 [3] => Ячейка 4)
Предположим, что мы хотим заменить ключ второй ячейки, ключ №1.
1). Получаем значение ключа в новую ячейку:
Опять выведем, что у нас получилось — print_r($array_example);
Array(
[0] => Ячейка 1 [1] => Ячейка 2 [2] => Ячейка 3 [3] => Ячейка 4 [4] => Ячейка 2)
Для удаления строго ключа нам потребуется функция unset:
Результат замены ключа в массиве.
Array(
[0] => Ячейка 1 [2] => Ячейка 3 [3] => Ячейка 4 [4] => Ячейка 2)
Вывод о замене ключа:
При такой замене имени ключа, нарушается нумерация ключей. Теперь нам нужно(если нужно) восстановить нумерацию ключей
Array(
[0] => Ячейка 1 [1] => Ячейка 3 [2] => Ячейка 4 [3] => Ячейка 2)
Замена ключа без изменения положения ключа.
Но, что, если вам требуется сохранить положение ключа в массиве и заменить его имя — есть какие-то варианты?
Поскольку у меня на сайте есть множество данных хранимых в ассоциативных массивах, то и ключи периодически приходится заменять, но , чтобы место данного ключа не менялось!
Замена имени ключа в цикле.
Предположим, что у нас есть ассоциативный массив(приведем простой пример такого массива):
Array(
[помидоры] => 15 [огурцы] => 12 [петрушка] => 22 [бананы] => 16)
Замена ключа без изменения положения в массиве:
Предположим, что в выше приведенном массиве нам требуется изменить имя ключа номер 2(огурцы) на какое-то другое, без изменения положения в массиве, для этого вам понадоится:
Выше цикла создаем новый массив:
Для этого примера нам понадобится, цикл foreach
Внутри цикла создадим условие if и проверим, если ключ массива «огурцы»
То, создаем в цикле новый массив «$new_arr» с новым ключом «новые_огурцы» и значением старого ключа:
И далее. вернем в старый массив новый:
Соберем весь код замены ключа на новый:
foreach ($price as $key => $value)
Ну и далее. нам остается только вывести результат замены ключа в массиве, без изменения его положения:
Результат вывода замены ключа:
Array(
[помидоры] => 15 [новые_огурцы] => 12 [петрушка] => 22 [бананы] => 16)
16.09.2022 13:37 Сергей Fortoo
unset ($price[$key]);
Убить старый ключ нужно когда переименование ключа происходит в первоначальном массиве, а в данном примере, Вы создаёте новый массив, поэтому unset ($price[$key]); не нужен.
16.09.2022 14:58 Марат Сергей Fortoo
PHP: Replace an array key.
This is a beginners tutorial on how to replace an array key in PHP. In the guide below, I will also demonstrate how to replace a key in an associative array while preserving the array’s original order.
Replacing an array key.
Let’s start off by creating a simple PHP array:
//Example associative PHP array $arr = array( 'user_name' => 'John', 'age' => 32, 'nationality' => 'English' ); //var_dump var_dump($arr);
If you var_dump the associative PHP array above, you will be given the following result:
Now, let’s say that you want to replace the key user_name with a new key called name. Firstly, you will need create the new key like so:
//Add the new key. $arr['name'] = $arr['user_name']; //var_dump var_dump($arr);
In the code above, we assigned the value of user_name to a new key called name. This leaves us with an array that looks like this:
As you can see, we now have two elements with the exact same value. This means that we can now delete the old key:
//Remove the old key. unset($arr['user_name']); //var_dump var_dump($arr);
Once you have removed the old key using PHP’s unset function, you will be left with the following array:
To sum it up: We ‘replaced’ the array key in question by assigning the element to a new key. Once the element was copied over, we were then able to remove the old key by using the unset function.
Replacing a key and preserving the order.
The code above does not preserve the original order of the array. As you probably noticed, the name of the person went from the top of the array to the bottom of the array. Although this won’t be a problem in the vast majority of cases, there could be scenarios where you need to replace an array key and preserve the original order.
In order to do this, you can use the custom PHP function below:
/** * Replaces an array key and preserves the original * order. * * @param $array The array in question. * @param $oldKey The key that you want to replace. * @param $newKey The name of the new key. * * @return array */ function replaceArrayKey($array, $oldKey, $newKey) < //If the old key doesn't exist, we can't replace it. if(!isset($array[$oldKey]))< return $array; >//Get a list of all keys in the array. $arrayKeys = array_keys($array); //Replace the key in our $arrayKeys array. $oldKeyIndex = array_search($oldKey, $arrayKeys); $arrayKeys[$oldKeyIndex] = $newKey; //Combine them back into one array. $newArray = array_combine($arrayKeys, $array); return $newArray; >
Here is an example of the replaceArrayKey function being used:
$arr = replaceArrayKey($arr, 'nationality', 'user_nationality'); var_dump($arr);
In the PHP code above, I replaced the key nationality with a new array key called user_nationality. If you run the example for yourself, you should get the following result:
And as promised, the original order of the array was preserved!