Intereting Posts
Расширение Mongo php после обновления Heroku (композитор) Ошибка при попытке запустить HipHop в «режиме 2 (компиляция HipHop во временном каталоге и запуск скомпилированной программы из командной строки») jQuery $ .post обработка ответа JSON как создать вложенный массив и сохранить его в базе данных? Настройка задания Godaddy cron для запуска скрипта php Как перенаправить обратно в форму с помощью ввода – Laravel 5 Выполнение PhP Upload в PhP 5.4 не работает. Не заданы переменные сеанса Что брандмауэр Symfony делает так долго? PHP Преобразование даты в «пустые» дни / часы / секунды назад Избегайте XML-предупреждений DOMDocument в php Drupal – блоки отображения в соответствии с идентификатором терминов таксономии узла Что такое шаблон фабричного проектирования в PHP? как читать содержимое html body с помощью cURL (PHP5) Извлечение тега заголовка и адреса RSS-канала из HTML с помощью PHP DOM или Regex UNION два варианта из одной базы данных PHP SQL

Изменить ключ в ассоциативном массиве в PHP

Скажем, у меня есть массив вроде этого:

array(2) { [0]=> array(2) { ["n"]=> string(4) "john" ["l"]=> string(3) "red" } [1]=> array(2) { ["n"]=> string(5) "nicel" ["l"]=> string(4) "blue" } } 

Как изменить ключи внутренних массивов? Скажем, я хочу изменить «n» для «name» и «l» для «last_name». Принимая во внимание, что это может произойти, чем массив не имеет определенного ключа.

Solutions Collecting From Web of "Изменить ключ в ассоциативном массиве в PHP"

Использование array_walk

 array_walk($array, function (& $item) { $item['new_key'] = $item['old_key']; unset($item['old_key']); }); с array_walk($array, function (& $item) { $item['new_key'] = $item['old_key']; unset($item['old_key']); }); 

Что-то вроде этого может быть:

 if (isset($array['n'])) { $array['name'] = $array['n']; unset($array['n']); } с if (isset($array['n'])) { $array['name'] = $array['n']; unset($array['n']); } 

ПРИМЕЧАНИЕ. Это решение изменит порядок ключей. Чтобы сохранить заказ, вам придется воссоздать массив.

Вы могли бы:

  1. массив, который отображает обмен ключами (чтобы сделать процесс параметризуемым)
  2. цикл обрабатывает исходный массив, доступ к каждому элементу массива по ссылке

Например:

 $array = array( array('n'=>'john','l'=>'red'), array('n'=>'nicel','l'=>'blue') ); $mapKeyArray = array('n'=>'name','l'=>'last_name'); foreach( $array as &$item ) { foreach( $mapKeyArray as $key => $replace ) { if (key_exists($key,$item)) { $item[$replace] = $item[$key]; unset($item[$key]); } } } с $array = array( array('n'=>'john','l'=>'red'), array('n'=>'nicel','l'=>'blue') ); $mapKeyArray = array('n'=>'name','l'=>'last_name'); foreach( $array as &$item ) { foreach( $mapKeyArray as $key => $replace ) { if (key_exists($key,$item)) { $item[$replace] = $item[$key]; unset($item[$key]); } } } 

Таким образом, вы можете иметь другие замены, просто добавляя пару ключ / значение в переменную $mapKeyArray .

Это решение также работает, если какой-либо ключ недоступен в исходном массиве

Просто запомните старое значение, используйте unset, чтобы удалить его из массива, затем добавьте его с новым ключом и старой парой значений.

Вы можете использовать функцию array_flip :

 $original = array('n'=>'john','l'=>'red'); $flipped = array_flip($original); foreach($flipped as $k => $v){ $flipped[$k] = ($v === 'n' ? 'name' : ($v === 'l' ? 'last_name' : $v)); } $correctedOriginal = array_flip($flipped); 

Переименование ключа И поддержание упорядоченности (более поздний был важным для использования, когда был написан следующий код).

 <?php /** * Rename a key and preserve the key ordering. * * An E_USER_WARNING is thrown if there is an problem. * * @param array &$data The data. * @param string $oldKey The old key. * @param string $newKey The new key. * @param bool $ignoreMissing Don't raise an error if the $oldKey does not exist. * @param bool $replaceExisting Don't raise an error if the $newKey already exists. * * @return bool True if the rename was successful or False if the old key cannot be found or the new key already exists. */ function renameKey(array &$data, $oldKey, $newKey, $ignoreMissing = false, $replaceExisting = false) { if (!empty($data)) { if (!array_key_exists($oldKey, $data)) { if ($ignoreMissing) { return false; } return !trigger_error('Old key does not exist', E_USER_WARNING); } else { if (array_key_exists($newKey, $data)) { if ($replaceExisting) { unset($data[$newKey]); } else { return !trigger_error('New key already exists', E_USER_WARNING); } } $keys = array_keys($data); $keys[array_search($oldKey, $keys)] = $newKey; $data = array_combine($keys, $data); return true; } } return false; } не <?php /** * Rename a key and preserve the key ordering. * * An E_USER_WARNING is thrown if there is an problem. * * @param array &$data The data. * @param string $oldKey The old key. * @param string $newKey The new key. * @param bool $ignoreMissing Don't raise an error if the $oldKey does not exist. * @param bool $replaceExisting Don't raise an error if the $newKey already exists. * * @return bool True if the rename was successful or False if the old key cannot be found or the new key already exists. */ function renameKey(array &$data, $oldKey, $newKey, $ignoreMissing = false, $replaceExisting = false) { if (!empty($data)) { if (!array_key_exists($oldKey, $data)) { if ($ignoreMissing) { return false; } return !trigger_error('Old key does not exist', E_USER_WARNING); } else { if (array_key_exists($newKey, $data)) { if ($replaceExisting) { unset($data[$newKey]); } else { return !trigger_error('New key already exists', E_USER_WARNING); } } $keys = array_keys($data); $keys[array_search($oldKey, $keys)] = $newKey; $data = array_combine($keys, $data); return true; } } return false; } Проточите <?php /** * Rename a key and preserve the key ordering. * * An E_USER_WARNING is thrown if there is an problem. * * @param array &$data The data. * @param string $oldKey The old key. * @param string $newKey The new key. * @param bool $ignoreMissing Don't raise an error if the $oldKey does not exist. * @param bool $replaceExisting Don't raise an error if the $newKey already exists. * * @return bool True if the rename was successful or False if the old key cannot be found or the new key already exists. */ function renameKey(array &$data, $oldKey, $newKey, $ignoreMissing = false, $replaceExisting = false) { if (!empty($data)) { if (!array_key_exists($oldKey, $data)) { if ($ignoreMissing) { return false; } return !trigger_error('Old key does not exist', E_USER_WARNING); } else { if (array_key_exists($newKey, $data)) { if ($replaceExisting) { unset($data[$newKey]); } else { return !trigger_error('New key already exists', E_USER_WARNING); } } $keys = array_keys($data); $keys[array_search($oldKey, $keys)] = $newKey; $data = array_combine($keys, $data); return true; } } return false; } 

И некоторые модульные тесты (PHPUnit используется, но, надеюсь, понятно, как цель тестов).

 public function testRenameKey() { $newData = $this->data; $this->assertTrue(Arrays::renameKey($newData, 200, 'TwoHundred')); $this->assertEquals( [ 100 => $this->one, 'TwoHundred' => $this->two, 300 => $this->three, ], $newData ); } public function testRenameKeyWithEmptyData() { $newData = []; $this->assertFalse(Arrays::renameKey($newData, 'junk1', 'junk2')); } public function testRenameKeyWithExistingNewKey() { Arrays::renameKey($this->data, 200, 200); $this->assertError('New key already exists', E_USER_WARNING); } public function testRenameKeyWithMissingOldKey() { Arrays::renameKey($this->data, 'Unknown', 'Unknown'); $this->assertError('Old key does not exist', E_USER_WARNING); } 

Утверждение AssertError доступно для PHPUnit из https://github.com/digitickets/phpunit-errorhandler