当我对名为$ tags(多维数组)的变量进行var_dump时,我得到了这个:
Array ( [0] => Array ( [name] => tabbing [url] => tabbing ) [1] => Array ( [name] => tabby ridiman [url] => tabby-ridiman ) [2] => Array ( [name] => tables [url] => tables ) [3] => Array ( [name] => tabloids [url] => tabloids ) [4] => Array ( [name] => taco bell [url] => taco-bell ) [5] => Array ( [name] => tacos [url] => tacos ) )
我想将名为“url”的所有数组键重命名为“value”。什么是一个好方法呢?
答案 0 :(得分:123)
您可以使用array_map()
来执行此操作。
$tags = array_map(function($tag) {
return array(
'name' => $tag['name'],
'value' => $tag['url']
);
}, $tags);
答案 1 :(得分:27)
循环,设置新密钥,取消设置旧密钥。
foreach($tags as &$val){
$val['value'] = $val['url'];
unset($val['url']);
}
答案 2 :(得分:4)
谈到功能性PHP,我有更通用的答案:
array_map(function($arr){
$ret = $arr;
$ret['value'] = $ret['url'];
unset($ret['url']);
return $ret;
}, $tag);
}
答案 3 :(得分: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的数量应该相同。但是,当它们不是空白键时添加。这意味着您可以使用它向阵列添加排序if。
一直使用它,希望它有所帮助!
答案 4 :(得分:3)
递归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;
}
答案 5 :(得分:1)
foreach ($basearr as &$row)
{
$row['value'] = $row['url'];
unset( $row['url'] );
}
unset($row);
答案 6 :(得分:1)
一种非常简单的方法来替换多维数组中的键,甚至可能有点危险,但是如果您对源数组有某种控制的话,它应该可以很好地工作:
$array = [ 'oldkey' => [ 'oldkey' => 'wow'] ];
$new_array = json_decode(str_replace('"oldkey":', '"newkey":', json_encode($array)));
print_r($new_array); // [ 'newkey' => [ 'newkey' => 'wow'] ]
答案 7 :(得分: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);
答案 8 :(得分: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);
答案 9 :(得分: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;
}
答案 10 :(得分:0)
基于 Alex 提供的出色解决方案,我根据我正在处理的场景创建了一个更灵活的解决方案。因此,现在您可以对具有不同嵌套键对数量的多个数组使用相同的函数,您只需要传入一个键名数组以用作替换。
$data_arr = [
0 => ['46894', 'SS'],
1 => ['46855', 'AZ'],
];
function renameKeys(&$data_arr, $columnNames) {
// change key names to be easier to work with.
$data_arr = array_map(function($tag) use( $columnNames) {
$tempArray = [];
$foreachindex = 0;
foreach ($tag as $key => $item) {
$tempArray[$columnNames[$foreachindex]] = $item;
$foreachindex++;
}
return $tempArray;
}, $data_arr);
}
renameKeys($data_arr, ["STRATEGY_ID","DATA_SOURCE"]);
答案 11 :(得分:0)
这对我来说非常适合
$some_options = array();;
if( !empty( $some_options ) ) {
foreach( $some_options as $theme_options_key => $theme_options_value ) {
if (strpos( $theme_options_key,'abc') !== false) { //first we check if the value contain
$theme_options_new_key = str_replace( 'abc', 'xyz', $theme_options_key ); //if yes, we simply replace
unset( $some_options[$theme_options_key] );
$some_options[$theme_options_new_key] = $theme_options_value;
}
}
}
return $some_options;
答案 12 :(得分:0)
这至少并不困难。无论数组在多维数组中的深度如何,您都可以简单地分配数组:
systemctl restart wazuh-manager