说我有这样的数组:
array(2) {
[0]=> array(2) {
["n"]=> string(4) "john"
["l"]=> string(3) "red"
}
[1]=> array(2) {
["n"]=> string(5) "nicel"
["l"]=> string(4) "blue"
}
}
如何更改内部数组的键?说,我想为“name”更改“n”,为“last_name”更改“l”。考虑到它可能发生,而不是数组没有特定的密钥。
答案 0 :(得分:15)
这样的事情可能是:
if (isset($array['n'])) {
$array['name'] = $array['n'];
unset($array['n']);
}
注意:此解决方案将更改密钥的顺序。要保留顺序,您必须重新创建数组。
答案 1 :(得分:12)
使用array_walk
array_walk($array, function (& $item) {
$item['new_key'] = $item['old_key'];
unset($item['old_key']);
});
答案 2 :(得分:3)
你可以:
E.g:
$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
变量中添加几个键/值即可进行其他替换。
如果原始数组中没有某些键
,此解决方案也可以使用答案 3 :(得分:1)
只需记下旧值,使用unset将其从数组中删除,然后使用新密钥和旧值对添加它。
答案 4 :(得分:1)
重命名密钥并保持顺序一致(后者对于编写以下代码的用例很重要。)
<?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, array_map('strval', $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);
}
public function testRenameKeyWithMixedNumericAndStringIndicies()
{
$data = [
'nice', // Index 0
'car' => 'fast',
'none', // Index 1
];
$this->assertTrue(Arrays::renameKey($data, 'car', 2));
$this->assertEquals(
[
0 => 'nice',
2 => 'fast',
1 => 'none',
],
$data
);
}
AssertError断言可用于https://github.com/digitickets/phpunit-errorhandler
中的PHPUnit答案 5 :(得分:0)
您可以使用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);
答案 6 :(得分:0)
function arrayReplaceKey($array, $oldKey, $newKey) {
$r = array();
foreach ($array as $k => $v) {
if ($k === $oldKey) $k = $newKey;
$r[$k] = $v;
}
return $r;
}
答案 7 :(得分:0)
这是更改阵列键并保留阵列中原始位置的解决方案。它旨在用于关联数组。就我而言,值是对象,但我已简化了此示例。
// Our array
$fields = array(
'first_name' => 'Radley',
'last_name' => 'Sustaire',
'date' => '6/26/2019', // <== Want to rename the key from "date" to "date_db"
'amazing' => 'yes',
);
// Get the field value
$date_field = $fields['date'];
// Get the key position in the array (numeric)
$key_position = array_search( 'date', array_keys($fields) );
// Remove the original value
unset($fields['date']);
// Add the new value back in, with the new key, at the old position
$fields = array_merge(
array_slice( $fields, 0, $key_position, true ),
array( 'date_db' => $date_field ), // Notice the new key ends with "_db"
array_slice( $fields, $key_position, null, true )
);
/*
Input:
Array(
[first_name] => Radley
[last_name] => Sustaire
[date] => 6/26/2019
[amazing] => yes
)
Output:
Array(
[first_name] => Radley
[last_name] => Sustaire
[date_db] => 6/26/2019
[amazing] => yes
)
*/
答案 8 :(得分:0)
foreach($arr as &$m)
{
$m['first_name'] = $m['n'];
$m['last_name'] = $m['l'];
unset($m['l'], m['n']);
}
print_r($arr);