如何在PHP中重命名数组键?


70

当我在名为$ tags的变量(多维数组)上执行var_dump时,会得到以下信息:

数组
(
    [0] =>数组
        (
            [名称] =>制表符
            [url] =>制表符
        )

    [1] =>数组
        (
            [名称] =>虎斑猫
            [url] =>虎斑搭i
        )

    [2] =>数组
        (
            [名称] =>表格
            [url] =>表格
        )

    [3] =>数组
        (
            [名称] =>小报
            [url] =>小报
        )

    [4] =>数组
        (
            [名称] =>塔可钟
            [url] =>塔可钟
        )

    [5] =>数组
        (
            [名称] =>炸玉米饼
            [url] =>炸玉米饼
        )
)

我想将所有名为“ url”的数组键重命名为“ value”。什么是做到这一点的好方法?




在PHP> = 5.5.0中array_column,可能对此有用。
kenorb 2015年

Answers:


152

您可以array_map()用来做。

$tags = array_map(function($tag) {
    return array(
        'name' => $tag['name'],
        'value' => $tag['url']
    );
}, $tags);

10
真好!快速说明:闭包(匿名函数)仅在PHP 5.3.0+中可用
Mallard

10
快速说明:您需要使用PHP 5.6或更高版本,否则您正在运行不受支持的php版本,并且可能会遇到安全问题。
约翰·亨特

1
非常快速的注释:使用PHP 7时可以保存树
Miguel Pynto

1
最快的一个:即将推出php 8
lezhni

您好,我有一个包含多列的案例,有没有一种方法可以使用类似的功能,该功能不会覆盖每个项目,而是会改变?还有很多其他的编码……
Valter Ekholm,2008年

38

循环浏览,设置新密钥,取消设置旧密钥。

foreach($tags as &$val){
    $val['value'] = $val['url'];
    unset($val['url']);
}

8

谈到功能PHP,我有一个更通用的答案:

    array_map(function($arr){
        $ret = $arr;
        $ret['value'] = $ret['url'];
        unset($ret['url']);
        return $ret;
    }, $tag);
}

6

递归php重命名键功能:

function replaceKeys($oldKey, $newKey, array $input){
    $return = array(); 
    foreach ($input as $key => $value) {
        if ($key===$oldKey)
            $key = $newKey;

        if (is_array($value))
            $value = replaceKeys( $oldKey, $newKey, $value);

        $return[$key] = $value;
    }
    return $return; 
}

1
这是一个绝妙的解决方案!它会在多维数组中的任意位置重命名键。谢谢您,这节省了我很多时间。
克林顿

4
foreach ($basearr as &$row)
{
    $row['value'] = $row['url'];
    unset( $row['url'] );
}

unset($row);

2
警告:即使在foreach循环之后,对$ row和最后一个数组元素的引用仍然保留。建议通过unset()销毁它。否则,您可能会遇到意外的行为。见secure.php.net/manual/en/control-structures.foreach.phpstackoverflow.com/q/3307409stackoverflow.com/q/4969243

至少您不需要$row在迭代后使用foreach,而是在函数内部执行,它将在函数结束后自动销毁。$row如果您中断了迭代并想在外部使用最后一个迭代的元素,则有时会很有用foreach
StefansArya

感谢@griever,您节省了我的时间
Faridul Khan

3

这在PHP 4+的大多数版本中都应适用。在5.3以下,不支持使用匿名函数的数组映射。

同样,当使用严格的PHP错误处理时,foreach示例也会引发警告。

这是一个小型的多维键重命名功能。它也可以用于处理数组,以在整个应用程序中具有正确的密钥来保证完整性。当密钥不存在时,它将不会引发任何错误。

function multi_rename_key(&$array, $old_keys, $new_keys)
{
    if(!is_array($array)){
        ($array=="") ? $array=array() : false;
        return $array;
    }
    foreach($array as &$arr){
        if (is_array($old_keys))
        {
            foreach($new_keys as $k => $new_key)
            {
                (isset($old_keys[$k])) ? true : $old_keys[$k]=NULL;
                $arr[$new_key] = (isset($arr[$old_keys[$k]]) ? $arr[$old_keys[$k]] : null);
                unset($arr[$old_keys[$k]]);
            }
        }else{
            $arr[$new_keys] = (isset($arr[$old_keys]) ? $arr[$old_keys] : null);
            unset($arr[$old_keys]);
        }
    }
    return $array;
}

用法很简单。您可以像示例一样更改单个键:

multi_rename_key($tags, "url", "value");

或更复杂的多键

multi_rename_key($tags, array("url","name"), array("value","title"));

它使用与preg_replace()类似的语法,其中$ old_keys和$ new_keys的数量应相同。但是,当它们不是空白键时,将被添加。这意味着您可以使用它向数组添加排序模式。

一直使用此功能,希望对您有所帮助!


或者,您可以只使用array_map($ tags,create_function('$ tag','return array(“ name” => $ tag [“ name”],“ value” => $ tag [“ url”]')));
Noishe 2014年

当您进行系统重命名时,这的确会变得混乱。create_function也使用eval,如果可能,显然应该避免使用eval。
斯蒂芬·弗雷泽

1
为什么如此不必要地复杂?
ahnbizcad

1

替换多维数组中键的非常简单的方法,甚至可能有点危险,但是如果您对源数组有某种控制,它应该可以正常工作:

$array = [ 'oldkey' => [ 'oldkey' => 'wow'] ];
$new_array = json_decode(str_replace('"oldkey":', '"newkey":', json_encode($array)));
print_r($new_array); // [ 'newkey' => [ 'newkey' => 'wow'] ]

0
class DataHelper{

    private static function __renameArrayKeysRecursive($map = [], &$array = [], $level = 0, &$storage = []) {
        foreach ($map as $old => $new) {
            $old = preg_replace('/([\.]{1}+)$/', '', trim($old));
            if ($new) {
                if (!is_array($new)) {
                    $array[$new] = $array[$old];
                    $storage[$level][$old] = $new;
                    unset($array[$old]);
                } else {
                    if (isset($array[$old])) {
                        static::__renameArrayKeysRecursive($new, $array[$old], $level + 1, $storage);
                    } else if (isset($array[$storage[$level][$old]])) {
                        static::__renameArrayKeysRecursive($new, $array[$storage[$level][$old]], $level + 1, $storage);
                    }
                }
            }
        }
    }

    /**
     * Renames array keys. (add "." at the end of key in mapping array if you want rename multidimentional array key).
     * @param type $map
     * @param type $array
    */
    public static function renameArrayKeys($map = [], &$array = [])
    {
        $storage = [];
        static::__renameArrayKeysRecursive($map, $array, 0, $storage);
        unset($storage);
    }
}

采用:

DataHelper::renameArrayKeys([
    'a' => 'b',
    'abc.' => [
       'abcd' => 'dcba'
    ]
], $yourArray);

0

来自重复的问题

$json = '[   
{"product_id":"63","product_batch":"BAtch1","product_quantity":"50","product_price":"200","discount":"0","net_price":"20000"},    
{"product_id":"67","product_batch":"Batch2","product_quantity":"50","product_price":"200","discount":"0","net_price":"20000"}
]';

$array = json_decode($json, true);

$out = array_map(function ($product) {
  return array_merge([
    'price'    => $product['product_price'],
    'quantity' => $product['product_quantity'],
  ], array_flip(array_filter(array_flip($product), function ($value) {
    return $value != 'product_price' && $value != 'product_quantity';
  })));
}, $array);

var_dump($out);

https://repl.it/@Piterden/Replace-keys-in-array


0

这是我重命名键的方式,尤其是使用已在电子表格中上传的数据时:

function changeKeys($array, $new_keys) {
    $newArray = [];

    foreach($array as $row) {
        $oldKeys = array_keys($row);
        $indexedRow = [];

        foreach($new_keys as $index => $newKey)
            $indexedRow[$newKey] = isset($oldKeys[$index]) ? $row[$oldKeys[$index]] : '';

        $newArray[] = $indexedRow;
    }

    return $newArray;
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.