2012-01-07 28 views
0

特定のキー/値に基づいて並べ替えるマルチ配列(現在はオブジェクト付き)があります。PHP/MySQL:既存の配列から多次元配列を再作成

Array 
(
[0] => stdClass Object 
    (
     [task_id] => 1 
     [task_title] => Title 
     [users_username] => John 
    ) 
[1] => stdClass Object 
    (
     [task_id] => 2 
     [task_title] => Title 
     [users_username] => John 
    ) 
[2] => stdClass Object 
    (
     [task_id] => 3 
     [task_title] => Title 
     [users_username] => Mike 
    ) 
) 

私はmulti-arrayをuser_nameで取得するために再配列したいので、ユーザー名でタスクを繰り返し実行できます。

Array 
(
    [John] => Array 
     (
      [0] => Array 
       (
        [task_id] => 1 
        [title] => Title 
       ) 

      [1] => Array 
       (
        [task_id] => 2 
        [title] => Title 
       ) 

     ) 

    [Mike] => Array 
     (
      [0] => Array 
       (
        [task_id] => 3 
        [title] => Title 
       ) 

     ) 

) 

上記の配列に配列を再作成することはできますか?

答えて

1

更新バージョンksortの事について

<?php 
$it0 = (object) array('task_id' => 1,'task_title' => 'Title','users_username' => 'John'); 
$it1 = (object) array('task_id' => 2,'task_title' => 'Title','users_username' => 'John'); 
$it2 = (object) array('task_id' => 3,'task_title' => 'Title','users_username' => 'Mike'); 

$array = array($it0,$it1,$it2); 

$return = array(); 
foreach($array as $id => $value){ 
    $return[$value->users_username][] = array('task_id' => $value->task_id,'title' => $value->task_title); 
} 

var_dump($return); 
+1

ありがとう、それはかなり短いと動作します。そのような単純なことを知らなかった:-) – suntrop

+0

PHPで無効な構文なので、これをどのように動作させるかわかりません。 –

1

いくつかの組み込み関数を使ってこれを行う別の方法があるかもしれませんが、時には私はむしろ自分で行い、ドキュメンテーションを調べることなくどのように動作しているか知っています。

アプローチ:

[users_username]を見て、新しい配列にそれらを入れて、最初の配列のすべてを繰り返します。

コード:

$dst_array = array(); 
foreach ($src_array as $val) 
{ 
    $user = $val->users_username; 

    // TODO: This check may be unnecessary. Have to test to find out. 
    // If this username doesn't already have an array in the destination... 
    if (!array_key_exists($user, $dst_array)) 
     $dst_array[$user] = array(); // Create a new array for that username 

    // Now add a new task_id and title entry in that username's array 
    $dst_array[$user][] = array(
     'task_id' => $val->task_id 
     'title' => $val->title 
    ); 
} 
0

ちょうどこのような何か(そうでないかもしれない100%のPHPコード):

foreach ($obj : $oldArray) { 
    $newTask['task_id'] = $obj->task_id; 
    $newTask['title'] = $obj->title; 

    $newArray[$oldName][] = $newTask; 
} 

あなたがそれを注文したい場合は

。後で注文機能を呼び出すことができます。

1

はい、可能です。 現在の配列をループし、それを行うために新しい配列を作成する必要があります。

例:

$new_array = array(); 
foreach ($array as $row) 
{ 
    $new_row = array(
     'task_id' => $row->task_id, 
     'title' => $row->task_title, 
    ); 
    $name = $row->users_username; 

    if (isset($new_array[$name])) 
    { 
     $new_array[$name][] = $new_row; 
    } 
    else 
    { 
     $new_array[$name] = array($new_row); 
    } 
} 

$new_arrayはまさにあなたが求めているような新しい配列が含まれています。

次に、あなたは、コードの

ksort($new_array); 
+0

おかげでそれを並べ替えることができます! – suntrop