PHP中的数组键名映射

时间:2018-02-27 17:27:08

标签: php arrays

我真的很难在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;
    }

1 个答案:

答案 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]