转置包含不同计数的索引行的 2d 数组的关联数组元素并强制执行自定义默认值

问题描述 投票:0回答:2

如何转换输入数组

$input['id'] = [1,2,3,4];
$input['name'] = ['a' , 'b' , 'c'];
$input['alias'] = ['i' , 'ii' , 'iii' , 'iv' , 'v'];
$input['object'] = [$object1 , $object2];

输出数组

$output[] = ['id'=>1 , 'name'=>'a' , 'alias'=>'i' , 'object'=>$object1];
$output[] = ['id'=>2 , 'name'=>'b' , 'alias'=>'ii' , 'object'=>$object2];
$output[] = ['id'=>3 , 'name'=>'c' , 'alias'=>'iii' , 'object'=>NULL];
$output[] = ['id'=>4 , 'name'=>'' , 'alias'=>'iv' , 'object'=>NULL];
$output[] = ['id'=>0 , 'name'=>'' , 'alias'=>'v' , 'object'=>NULL];

错过的号码 = 0
丢失的字符串 = ''
错过的对象=空

php arrays cakephp-3.0 transpose default-value
2个回答
0
投票

作为第一个答案,我会执行以下操作:

$output = array_map(null, $input['id'], $input['name'], $input['alias'], $input['object']);

这将从您的数组创建一个数组。

此解决方案的对应部分是,如果未设置值,它总是返回

null

更多信息:http://php.net/manual/en/function.array-map.php#example-5583


编辑 2017 年 5 月 3 日 如果您需要将键添加到输出(id、名称、别名、对象),您可以对堆栈中的每个项目应用一个函数来添加它们。 以下是一个可能的解决方案:

array_walk($output, function(&$item, $key) {
    $item = array_combine(['id','name','alias', 'object'], array_values($item));
});


0
投票

使用

array_map()
转置数据将无需手动计算所需的迭代次数。要在丢失时整理首选默认值,请在每次迭代返回新关联行之前使用空合并赋值运算符。

代码:(演示

var_export(
    array_map(
        function(?int $id, ?string $name, ?string $alias, ?object $object) {
            $id ??= 0;
            $name ??= '';
            $alias ??= '';
            return get_defined_vars();    
        },
        $input['id'],
        $input['name'],
        $input['alias'],
        $input['object']
    )
);

输出:

array (
  0 => 
  array (
    'id' => 1,
    'name' => 'a',
    'alias' => 'i',
    'object' => 
    (object) array(
       'foo' => 1,
    ),
  ),
  1 => 
  array (
    'id' => 2,
    'name' => 'b',
    'alias' => 'ii',
    'object' => 
    (object) array(
       'bar' => 2,
    ),
  ),
  2 => 
  array (
    'id' => 3,
    'name' => 'c',
    'alias' => 'iii',
    'object' => NULL,
  ),
  3 => 
  array (
    'id' => 4,
    'name' => '',
    'alias' => 'iv',
    'object' => NULL,
  ),
  4 => 
  array (
    'id' => 0,
    'name' => '',
    'alias' => 'v',
    'object' => NULL,
  ),
)
© www.soinside.com 2019 - 2024. All rights reserved.