1

のような連想配列を持つ

$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
        ...
    )
);
4

2 に答える 2

3

array_values次のように関数を使用します。

$result = array(array_values($myarray['user']), 
          array_values($myarray['city']), 
          array_values($myarray['age']));

質問の2番目の部分については、次のことができます。

$result2 = array_keys($myarray);

foreach(array_keys($myarray['user']) as $k) {
  $result2[] = array($k, $myarray['user'][$k], $myarray['city'][$k], $myarray['age'][$k]);
}
于 2012-05-08T13:45:31.813 に答える
3

これらの操作はどちらも基本的に元の配列の転置であることに注意してください。

これはすべて、この回答から強く適応されています(賛成票を投じることを検討してください!)。

ヘルパー

まず、行ヘッダーを連想配列のキーとして保持するヘルパー関数が必要です。

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 (
  'row' => 
  array (
    0 => 'user',
    1 => 'city',
    2 => 'age',
  ),
  2 => 
  array (
    0 => 'john',
    1 => 'london',
    2 => 24,
  ),
  5 => 
  array (
    0 => 'done',
    1 => 'buenos aires',
    2 => 38,
  ),
  21 => 
  array (
    0 => 'foo',
    1 => 'paris',
    2 => 16,
  ),
)

パート1

$result = array_values(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,
  ),
)

この部分は、この回答transposeから使用して実行することもできます:

$result = transpose($myarray);
array_unshift($result, array_keys($myarray));

パート2

function flipArrayWithHeadings($arr) {
    $out = flipArrayKeys($arr);

    foreach (array_keys($out) as $key) {
        array_unshift($out[$key],$key);
    }
    return array_values($out);
}

flipArrayWithHeadings($myarray)のようになります。

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,
  ),
)
于 2012-05-08T13:44:46.887 に答える