【问题标题】:Array key name mapping in PHPPHP中的数组键名映射
【发布时间】:2018-08-07 10:45:25
【问题描述】:

我真的陷入了使用 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;
    }

【问题讨论】:

  • 基于您的示例:$result['project'][$source['proj']['general']['keys'][1]] = 10;
  • 这没有你想象的那么简单。你基本上需要一个 recursive 函数。向我们展示您迄今为止所做的尝试。
  • ['app_name'], 'type' => 'int'], => API sample 是这个错误吗?

标签: php arrays


【解决方案1】:

试试这个:

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]$vkeys 数组的第一个元素)。该值将使用来自$post[$k] 的数据。
  • $post[$k] 是一个数组。在这种情况下,我们将遍历$v。在每次迭代中,我们为$ret 构建一个数组元素。数组键将为$vv['keys'][0]$vvkeys 数组的第一个元素。$vv['keys'][0] 的元素将有一个键为$vv['keys'][1]keys 数组的第二个元素@ 987654350@)。$vv['keys'][1] 的值将是 $post[$k][$kk]

【讨论】:

  • 没有一个变量名那么有用。描述性变量名称更好。而不是$k => $v,为什么不是$key => $attributes,而不是$kk => $vv$sub_key => $sub_attributes(只是举例)。
  • 我只是想帮助你成为更好的编码员。用提示做你想做的事。我从这个网站上的其他开发人员那里学到了很多东西。如果你愿意倾听/接收输入,你也可以。或者,您可以成为一个聪明人,拒绝其他开发人员提供的反馈。由你决定。
猜你喜欢
  • 2012-08-16
  • 2019-04-11
  • 1970-01-01
  • 2021-05-22
  • 1970-01-01
  • 2011-07-03
  • 2020-07-13
  • 2020-01-31
  • 1970-01-01
相关资源
最近更新 更多