Скажем, у меня есть массив вроде этого:
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». Принимая во внимание, что это может произойти, чем массив не имеет определенного ключа.
Использование 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']); }
ПРИМЕЧАНИЕ. Это решение изменит порядок ключей. Чтобы сохранить заказ, вам придется воссоздать массив.
Вы могли бы:
Например:
$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