将索引数组的关联数组转置为关联数组的索引数组 [duplicate]

Transpose associative array of indexed arrays to be indexed array of associative arrays [duplicate]

提问人:Ben 提问时间:5/14/2016 最后编辑:mickmackusaBen 更新时间:9/15/2022 访问量:60

问:

我需要转换从表单提交中获取的PHP数组,以便我可以在数据库中更有用地使用它。

Array
(
  [first_name] => Array
    (
        [0] => Ben
        [1] => Tom
        [2] => Sarah
    )

  [last_name] => Array
    (
        [0] => Wills
        [1] => Main
        [2] => Bliss
    )

[email] => Array
    (
        [0] => [email protected]
        [1] => [email protected]
        [2] => [email protected]
    )
 )

自:

Array
(
[0] => Array
    (
        [first_name] => Ben
        [last_name] => Wills
        [email] => [email protected]
    )

[1] => Array
    (
        [first_name] => Tom
        [last_name] => Main
        [email] => [email protected]
    )
[2] => Array
    (
        [first_name] => Sarah
        [last_name] => Bliss
        [email] => [email protected]
    )

 )

如何更改值的键路径,以便交换第一级键和第二级键?

PHP 数组 转置

评论

3赞 Pedro Lobito 5/14/2016
问题在...你为什么不改变形式?

答:

1赞 Ravinder Reddy 5/14/2016 #1

使用以下代码。希望至少这能给人一些想法,如何进行:)

$array = array(
  'first_name' => array('Ben','Tom','Sarah'),
  'last_name' => array('Wills','Main','Bliss'),
  'email' => array('[email protected]','[email protected]','[email protected]')
 );
  // loop the array
  foreach($array as $key=>$value){
      foreach($value as $k=>$v){
          // use the first loop key here
          $new_array[$k][$key] = $v;
      }
  }
  print_r($new_array);

输出:

Array
(
[0] => Array
    (
        [first_name] => Ben
        [last_name] => Wills
        [email] => [email protected]
    )

[1] => Array
    (
        [first_name] => Tom
        [last_name] => Main
        [email] => [email protected]
    )

[2] => Array
    (
        [first_name] => Sarah
        [last_name] => Bliss
        [email] => [email protected]
    )

)

2赞 RomanPerekhrest 5/14/2016 #2

使用 、 、 和 函数的解决方案:array_keysarray_valuesarray_mapcall_user_func_arrayarray_combine

$keys = array_keys($arr);  // supposing $arr is your initial array
$data = call_user_func_array("array_map", array_merge([null], array_values($arr)));
$result = array_map(function($v) use($keys){
    return array_combine($keys, $v);
}, $data);

print_r($result);

输出:

Array
(
    [0] => Array
        (
            [first_name] => Ben
            [last_name] => Wills
            [email] => [email protected]
        )
    [1] => Array
        (
            [first_name] => Tom
            [last_name] => Main
            [email] => [email protected]
        )
    [2] => Array
        (
            [first_name] => Sarah
            [last_name] => Bliss
            [email] => [email protected]
        )
)

评论

0赞 Mark Baker 5/14/2016
不错的解决方案;我看了转调,但想不出如何恢复关联键
0赞 RomanPerekhrest 5/14/2016
@MarkBaker,我想起了那个有趣的功能:“......构造一个数组的数组,通过使用 NULL 作为回调函数的名称,可以很容易地执行“,这就是”事物”array_map
0赞 Mark Baker 5/14/2016 #3

使用 PHP 的 MultipleIterator 可以很容易地在保留键名的同时进行转换

$data = array(
    'first_name' => array(
        0 => 'Ben',
        1 => 'Tom',
        2 => 'Sarah',
    ),
    'last_name' => array(
        0 => 'Wills',
        1 => 'Main',
        2 => 'Bliss',
    ),
    'email' => array(
        0 => '[email protected]',
        1 => '[email protected]',
        2 => '[email protected]',
    ),
);

$mi = new MultipleIterator(MultipleIterator::MIT_NEED_ALL | MultipleIterator::MIT_KEYS_ASSOC);
foreach($data as $key => $column) {
    $mi->attachIterator(new ArrayIterator($column), $key);
}
$newData = [];
foreach($mi as $row) {
    $newData[] = $row;
}

var_dump($newData);

演示