Php 将关联数组转换为索引数组的优雅方法

Php 将关联数组转换为索引数组的优雅方法,php,arrays,Php,Arrays,具有类似于 $myarray = array ( 'user' => array ( 2 => 'john', 5 => 'done', 21 => 'foo' ), 'city' => array ( 2 => 'london', 5 => 'buenos aires', 21 => 'paris', ), 'age' => array (

具有类似于

$myarray = array (
  'user' => array (
      2 => 'john',
      5 => 'done',
      21 => 'foo'
  ),
  'city' => array (
      2 => 'london',
      5 => 'buenos aires',
      21 => 'paris',
  ),
  'age' => array (
      2 => 24,
      5 => 38,
      21 => 16
  )
  ...
);
编辑 假设我不知道这个数组有多少个键,也不知道键本身它们可能是什么,以上只是一个例子 有没有什么优雅的方法可以使用内置函数而不是循环将其转换为

$result = array(
    array(
        'user',
        'city',
        'age'
        ...
    ),
    array(
        'john',
        'london',
        24
        ...
    ),
    array(
        'done',
        'buenos aires',
        38
        ...
    ),
    array(
        'foo',
        'paris',
        16
        ...
    )
);
作为一个附带问题:如何以同样优雅的方式获得这一点

$result = array(
    array(
        'row',
        'user',
        'city',
        'age'
        ...
    ),
    array(
        2,
        'john',
        'london',
        24
        ...
    ),
    array(
        5,
        'done',
        'buenos aires',
        38
        ...
    ),
    array(
        21,
        'foo',
        'paris',
        16
        ...
    )
);

请注意,这两个操作基本上都是原始数组的转置

<>这一切都是从考虑投票的强烈适应!p> 帮手 首先,我们需要一个helper函数,它将行标题保留为关联数组中的键:

function flipArrayKeys($arr) {
    $out = array('row' => array_keys($arr));
    foreach ($arr as $key => $subarr) {
        foreach ($subarr as $subkey => $subvalue) {
            $out[$subkey][] = $subvalue;
        }
    }
    return $out;
}
flipArrayKeys$myarray提供:

第一部分 现在的结果是:

array (
  0 => 
  array (
    0 => 'user',
    1 => 'city',
    2 => 'age',
  ),
  1 => 
  array (
    0 => 'john',
    1 => 'london',
    2 => 24,
  ),
  2 => 
  array (
    0 => 'done',
    1 => 'buenos aires',
    2 => 38,
  ),
  3 => 
  array (
    0 => 'foo',
    1 => 'paris',
    2 => 16,
  ),
)
array (
  0 => 
  array (
    0 => 'row',
    1 => 'user',
    2 => 'city',
    3 => 'age',
  ),
  1 => 
  array (
    0 => 2,
    1 => 'john',
    2 => 'london',
    3 => 24,
  ),
  2 => 
  array (
    0 => 5,
    1 => 'done',
    2 => 'buenos aires',
    3 => 38,
  ),
  3 => 
  array (
    0 => 21,
    1 => 'foo',
    2 => 'paris',
    3 => 16,
  ),
)
这一部分也可以使用转置从以下位置完成:

第二部分 所以FlipArrayWithHeaders$myarray看起来像:

array (
  0 => 
  array (
    0 => 'user',
    1 => 'city',
    2 => 'age',
  ),
  1 => 
  array (
    0 => 'john',
    1 => 'london',
    2 => 24,
  ),
  2 => 
  array (
    0 => 'done',
    1 => 'buenos aires',
    2 => 38,
  ),
  3 => 
  array (
    0 => 'foo',
    1 => 'paris',
    2 => 16,
  ),
)
array (
  0 => 
  array (
    0 => 'row',
    1 => 'user',
    2 => 'city',
    3 => 'age',
  ),
  1 => 
  array (
    0 => 2,
    1 => 'john',
    2 => 'london',
    3 => 24,
  ),
  2 => 
  array (
    0 => 5,
    1 => 'done',
    2 => 'buenos aires',
    3 => 38,
  ),
  3 => 
  array (
    0 => 21,
    1 => 'foo',
    2 => 'paris',
    3 => 16,
  ),
)

请注意,这两个操作基本上都是原始数组的转置

<>这一切都是从考虑投票的强烈适应!p> 帮手 首先,我们需要一个helper函数,它将行标题保留为关联数组中的键:

function flipArrayKeys($arr) {
    $out = array('row' => array_keys($arr));
    foreach ($arr as $key => $subarr) {
        foreach ($subarr as $subkey => $subvalue) {
            $out[$subkey][] = $subvalue;
        }
    }
    return $out;
}
flipArrayKeys$myarray提供:

第一部分 现在的结果是:

array (
  0 => 
  array (
    0 => 'user',
    1 => 'city',
    2 => 'age',
  ),
  1 => 
  array (
    0 => 'john',
    1 => 'london',
    2 => 24,
  ),
  2 => 
  array (
    0 => 'done',
    1 => 'buenos aires',
    2 => 38,
  ),
  3 => 
  array (
    0 => 'foo',
    1 => 'paris',
    2 => 16,
  ),
)
array (
  0 => 
  array (
    0 => 'row',
    1 => 'user',
    2 => 'city',
    3 => 'age',
  ),
  1 => 
  array (
    0 => 2,
    1 => 'john',
    2 => 'london',
    3 => 24,
  ),
  2 => 
  array (
    0 => 5,
    1 => 'done',
    2 => 'buenos aires',
    3 => 38,
  ),
  3 => 
  array (
    0 => 21,
    1 => 'foo',
    2 => 'paris',
    3 => 16,
  ),
)
这一部分也可以使用转置从以下位置完成:

第二部分 所以FlipArrayWithHeaders$myarray看起来像:

array (
  0 => 
  array (
    0 => 'user',
    1 => 'city',
    2 => 'age',
  ),
  1 => 
  array (
    0 => 'john',
    1 => 'london',
    2 => 24,
  ),
  2 => 
  array (
    0 => 'done',
    1 => 'buenos aires',
    2 => 38,
  ),
  3 => 
  array (
    0 => 'foo',
    1 => 'paris',
    2 => 16,
  ),
)
array (
  0 => 
  array (
    0 => 'row',
    1 => 'user',
    2 => 'city',
    3 => 'age',
  ),
  1 => 
  array (
    0 => 2,
    1 => 'john',
    2 => 'london',
    3 => 24,
  ),
  2 => 
  array (
    0 => 5,
    1 => 'done',
    2 => 'buenos aires',
    3 => 38,
  ),
  3 => 
  array (
    0 => 21,
    1 => 'foo',
    2 => 'paris',
    3 => 16,
  ),
)
将数组_值函数用作:

$result = array(array_values($myarray['user']), 
          array_values($myarray['city']), 
          array_values($myarray['age']));
对于问题的第二部分,您可以执行以下操作:

$result2 = array_keys($myarray);

foreach(array_keys($myarray['user']) as $k) {
  $result2[] = array($k, $myarray['user'][$k], $myarray['city'][$k], $myarray['age'][$k]);
}
将数组_值函数用作:

$result = array(array_values($myarray['user']), 
          array_values($myarray['city']), 
          array_values($myarray['age']));
对于问题的第二部分,您可以执行以下操作:

$result2 = array_keys($myarray);

foreach(array_keys($myarray['user']) as $k) {
  $result2[] = array($k, $myarray['user'][$k], $myarray['city'][$k], $myarray['age'][$k]);
}

如果我事先不知道钥匙怎么办?我编辑了我的问题以便更清楚地说明这一点……如果我事先不知道钥匙怎么办?我编辑了我的问题,以便更清楚地说明这一点……我需要一个不同混合的数组,请看得更好:例如,最后一个数组不是array24、38、16,而是数组'foo'、'paris',16。。他们完全改头换面了,我看错了问题;现在应该修好了!:不幸的是不是特别优雅。我需要一个不同混合的数组,请看得更好:例如,最后一个数组不是array24,38,16,而是数组'foo','paris',16。。他们完全改头换面了,我看错了问题;现在应该修好了!:不幸的是,它并不特别优雅。