我真的很难在PHP中使用映射数组重命名数组。我能够选择和更改具有字符串或int内容的元素的名称。但真的搞乱了嵌套数组。
映射数组:
$source = array(
'id' => ['keys' => ['app_id'], 'type' => 'int'],
'name' => ['keys' => ['app_name'], 'type' => 'string'],
'proj' => [
'general' => ['keys' => ['project', 'gen'], 'type' => 'string'],
'category' => ['keys' => ['project', 'cat'], 'type' => 'string']
]
);
转型之前:
$post = array(
'id' => 1000,
'name' => 'API sample',
'proj' => array(
'general' => 10,
'category' => 50
)
);
期望的输出:
$result = array(
'app_id' => 1000,
'app_name' => 'API sample',
'project' => array(
'gen' => 10,
'cat' => 50
)
);
代码:
function renameArray($mappings,$inputObjectDb) {
$inputObjectDb = (array)$inputObjectDb;
$response = [];
foreach($mappings as $key => $mapping) {
//call itself in order to prepare sub array
if(!isset($mapping['keys'])) {
$response[$key] = prepareOutputData($mapping,$inputObjectDb);
} else {
$dbSubarray = $inputObjectDb;
foreach( $mapping['keys'] as $subkey) {
$response[$key] = $dbSubarray[$subkey];
$dbSubarray = &$dbSubarray[$subkey];
}
}
}
return $response;
}
答案 0 :(得分:0)
试试这个:
foreach ($source as $k=>$v) {
if(!is_array($post[$k]))
$ret[$v['keys'][0]] = $post[$k];
else {
foreach($v as $kk=>$vv)
$ret[$vv['keys'][0]][$vv['keys'][1]] = $post[$k][$kk];
}
}
print_r($ret);
此最终输出将存储在$ret
。
我将使用的变量如下:
$k
- 将引用当前迭代中$source
的键$v
- 将引用$source[$k]
$kk
- 将引用当前迭代中$v
的键$vv
- 将引用$v[$kk]
首先,我们循环遍历$source
的元素。我们有两个选择:
$post[$k]
保存值(不是数组)。在这种情况下,我们为$ret
构建一个元素。密钥将使用$v['keys'][0]
(keys
中$v
数组的第一个元素。该值将使用$post[$k]
。$post[$k]
是一个数组。在这种情况下,我们将迭代$v
。在每次迭代中,我们为$ret
构建一个数组元素。数组键将为$vv['keys'][0]
(keys
$vv
数组的第一个元素。$vv['keys'][0]
的元素将具有$vv['keys'][1]
的键( keys
$vv
数组的第二个元素。$vv['keys'][1]
的值为$post[$k][$kk]
。