0

この質問のタイトルの付け方がよくわからないので、少し紛らわしくてすみません。

私は配列を持っています。

  Array
  (
      [username] => Array
          (
              [0] => 'a'
              [1] => 'b'
              [2] => 'c'
              [3] => 'd'
              [4] => 'e'
              [5] => 'f'
          )

      [email] => Array
          (
              [0] => 
              [1] => 
              [2] => 
              [3] => 
              [4] => 
              [5] => 
          )

      [level] => Array
          (
              [0] => 1
              [1] => 1
              [2] => 1
              [3] => 1
              [4] => 1
              [5] => 1
          )

      [role] => Array
          (
              [0] => 2
              [1] => 1
              [2] => 1
              [3] => 1
              [4] => 2
              [5] => 1
          )

      [password] => Array
          (
              [0] => 
              [1] => 
              [2] => 
              [3] => 
              [4] => 
              [5] => 
          )

      [id] => Array
          (
              [0] => 1
              [1] => 2
              [2] => 3
              [3] => 4
              [4] => 5
              [5] => 6
          )

  )

しかし、私はこの形式でそれをしたい:

  Array
  (
      [0] => Array
          (
              [username] => 'a'
              [id] => 'a'
              [email] => 'a'
          )
      [1] => Array
          (
              [username] => 'a'
              [id] => 'a'
              [email] => 'a'
          )
      [2] => Array
          (
              [username] => 'a'
              [id] => 'a'
              [email] => 'a'
          )
      [3] => Array
          (
              [username] => 'a'
              [id] => 'a'
              [email] => 'a'
          )
      [4] => Array
          (
              [username] => 'a'
              [id] => 'a'
              [email] => 'a'
          )
      [5] => Array
          (
              [username] => 'a'
              [id] => 'a'
              [email] => 'a'
          )

私はそれを理解できないようです.配列がすぐに終了するか、インデックスが多すぎます.アイデアはありますか?

4

2 に答える 2

1

配列をループして、次のように再構築します。

$index_count = count($array['username']); // in your case, this is 6

$new_array = array();
for ($i = 0; $i < $index_count; $i++) {
    $new_array[] = array(
        'username' => $array['username'][$i],
        'email' => $array['email'][$i],
        'id' => $array['id'][$i]
    );
}

更新これで考えられるすべてのキーを考慮に入れたい場合は、次のことを試してください。

$keys = array_keys($array);
if (count($keys)) {
    $index_count = count($array[$keys[0]]);

    $myArray = array();
    for ($i = 0; $i < $index_count; $i++) {
        $temp = array();
        foreach($keys as $key) {
            $temp[$key] = $array[$key][$i];
        }
        $myArray[] = $temp;
    }
}
于 2012-08-23T15:58:17.880 に答える
1

別の見方ですが、これが私がやることです - ステップバイステップ:

まず、キーを取得しましょう。キーはたくさん必要になります。

$result = array();//<-- this is the result array
$keys = array_keys($array);

次に、空のテンプレート配列 (モデル オブジェクトのようなもの)を取得します。

$base = array_fill_keys($keys,array());
//array('username'=>array,'id'=>array(),... 

次に、それを使用して結果配列を作成します。

$result = array_fill(0,count($array['username']),$base);
//In one-liner format, it looks like this:
$result = array_fill(0,count($array['username']),array_fill_keys(array_keys($array),array()));
//Works, but is messy as f***

次に、ロットを埋めるだけです。これが、その$keys変数が報われる場所です。

$length = count($result);
while ($key = array_shift($keys))
{
    for ($i=0;$i<$length;$i++)
    {
        $result[$i][$key] = $array[$key][$i];
    }
}

while ループの方がクリーンで (わずかに) 高速であるため、私は while ループを使用することを好みます。$keysあなたが進むにつれてその配列が空になるので、よりきれいです。かなりの量のデータを扱っている場合、違いが生じることがあります。データセットが非常に大きく、コードが完全にテストされている場合はshifting、ソース配列から検討することもできます (すべてのデータが含まれているため、キーだけを含む配列よりもはるかに大きくなります)。

while ($vals = array_shift($array))
{
    $key = array_shift($keys);//<-- keep track of what array has been shifted
    for ($i=0;$i<$length;$i++)
    {
        $result[$i][$key] = $vals[$i];
    }
}

これにより、ソース配列とキーがきれいにクリーンアップされます。この最後のアプローチをサーバーの writecodeonline と codepad でテストしましたが、まったく同じ結果が得られました。

$foo = array('bar'=>array_fill(0,2,'ás'),'quar'=>range('a','z'));
$keys = array_keys($foo);
while($vals = array_shift($foo))
{
    $key = array_shift($keys);
    echo $key.' contains: => '.implode(', ',$vals).'<br/>';
}

バーには以下が含まれます: => ás, ás

quar の内容: => a、b、c、d、e、f、g、h、i、j、k、l、m、n、o、p、q、r、s、t、u、v、w 、x、y、z

于 2012-08-23T16:40:51.657 に答える