1

現在、システムにメッセージング機能を実装しようとしています。今の私の目標は、他の人にメッセージを送信したユーザーの名前を表示するjQueryポップアップダイアログを表示し、その人の名前をクリックすると新しいメッセージが表示されるようにすることです。ポップアップダイアログビットを実行したので、次のステップはデータベースからメッセージを取得して並べ替えることです。

私が今やったことは、データベースから新しいメッセージを取得することです。未読メッセージの配列に送信者のIDの要素が複数回含まれているため、どのように進めるかがわかりません。未読メッセージをループして、同じ送信者IDを何度も取得したくないので、データベースからその詳細を何度も取得します。

これが私の配列の例です:

array(8) {
  [6]=>
  array(7) {
    ["id"]=>
    string(2) "52"
    ["useridfrom"]=>
    string(3) "330"
    ["useridto"]=>
    string(3) "139"
    ["message"]=>
    string(10) "test"
    ["format"]=>
    string(1) "0"
    ["timecreated"]=>
    string(10) "1336561645"
    ["messagetype"]=>
    string(6) "direct"
  }
  [7]=>
  array(7) {
    ["id"]=>
    string(2) "53"
    ["useridfrom"]=>
    string(3) "330"
    ["useridto"]=>
    string(3) "139"
    ["message"]=>
    string(8) "bye"
    ["format"]=>
    string(1) "0"
    ["timecreated"]=>
    string(10) "1336561648"
    ["messagetype"]=>
    string(6) "direct"
  }
  [1]=>
  array(7) {
    ["id"]=>
    string(2) "30"
    ["useridfrom"]=>
    string(3) "329"
    ["useridto"]=>
    string(3) "139"
    ["message"]=>
    string(243) "Hi Bob"
    ["format"]=>
    string(1) "0"
    ["timecreated"]=>
    string(10) "1330942044"
    ["messagetype"]=>
    string(6) "direct"
  }
  [3]=>
  array(7) {
    ["id"]=>
    string(2) "42"
    ["useridfrom"]=>
    string(3) "243"
    ["useridto"]=>
    string(3) "139"
    ["message"]=>
    string(4) "test"
    ["format"]=>
    string(1) "0"
    ["timecreated"]=>
    string(10) "1335517653"
    ["messagetype"]=>
    string(6) "direct"
  }
  [4]=>
  array(7) {
    ["id"]=>
    string(2) "46"
    ["useridfrom"]=>
    string(3) "241"
    ["useridto"]=>
    string(3) "139"
    ["message"]=>
    string(8) "sdsdfsdf"
    ["format"]=>
    string(1) "0"
    ["timecreated"]=>
    string(10) "1336139572"
    ["messagetype"]=>
    string(6) "direct"
  }
  [5]=>
  array(7) {
    ["id"]=>
    string(2) "47"
    ["useridfrom"]=>
    string(3) "241"
    ["useridto"]=>
    string(3) "139"
    ["message"]=>
    string(13) "8528528285285"
    ["format"]=>
    string(1) "0"
    ["timecreated"]=>
    string(10) "1336143958"
    ["messagetype"]=>
    string(6) "direct"
  }
array(8) {
  [6]=>
  array(7) {
    ["id"]=>
    string(2) "52"
    ["useridfrom"]=>
    string(3) "330"
    ["useridto"]=>
    string(3) "139"
    ["message"]=>
    string(10) "test"
    ["format"]=>
    string(1) "0"
    ["timecreated"]=>
    string(10) "1336561645"
    ["messagetype"]=>
    string(6) "direct"
  }
  [7]=>
  array(7) {
    ["id"]=>
    string(2) "53"
    ["useridfrom"]=>
    string(3) "330"
    ["useridto"]=>
    string(3) "139"
    ["message"]=>
    string(8) "bye"
    ["format"]=>
    string(1) "0"
    ["timecreated"]=>
    string(10) "1336561648"
    ["messagetype"]=>
    string(6) "direct"
  }
  [1]=>
  array(7) {
    ["id"]=>
    string(2) "30"
    ["useridfrom"]=>
    string(3) "329"
    ["useridto"]=>
    string(3) "139"
    ["message"]=>
    string(243) "Hi Bob"
    ["format"]=>
    string(1) "0"
    ["timecreated"]=>
    string(10) "1330942044"
    ["messagetype"]=>
    string(6) "direct"
  }
  [3]=>
  array(7) {
    ["id"]=>
    string(2) "42"
    ["useridfrom"]=>
    string(3) "243"
    ["useridto"]=>
    string(3) "139"
    ["message"]=>
    string(4) "test"
    ["format"]=>
    string(1) "0"
    ["timecreated"]=>
    string(10) "1335517653"
    ["messagetype"]=>
    string(6) "direct"
  }
  [4]=>
  array(7) {
    ["id"]=>
    string(2) "46"
    ["useridfrom"]=>
    string(3) "241"
    ["useridto"]=>
    string(3) "139"
    ["message"]=>
    string(8) "sdsdfsdf"
    ["format"]=>
    string(1) "0"
    ["timecreated"]=>
    string(10) "1336139572"
    ["messagetype"]=>
    string(6) "direct"
  }
  [5]=>
  array(7) {
    ["id"]=>
    string(2) "47"
    ["useridfrom"]=>
    string(3) "241"
    ["useridto"]=>
    string(3) "139"
    ["message"]=>
    string(13) "8528528285285"
    ["format"]=>
    string(1) "0"
    ["timecreated"]=>
    string(10) "1336143958"
    ["messagetype"]=>
    string(6) "direct"
  }
  [2]=>
  array(7) {
    ["id"]=>
    string(2) "10"
    ["useridfrom"]=>
    string(3) "138"
    ["useridto"]=>
    string(3) "139"
    ["message"]=>
    string(54) "Hi Emma thank you for submitting your homework - Jenny"
    ["format"]=>
    string(1) "0"
    ["timecreated"]=>
    string(10) "1309122193"
    ["messagetype"]=>
    string(6) "direct"
  }
}

これは私がこれまでPHPで行ったことです。

$m = new Messaging();
$json = $m->getUnreadMessages($uid);

/** sort messages by useridfrom **/
uasort($json, array($m, 'messageCompare'));

foreach($json as $j)
{
 //do sorting of messages here ??
}


echo json_encode($json);
exit;

理想的には、これから新しい配列を作成したいと思います。ここで、キーはuseridfrom(送信者)、次にメッセージであり、作成された時間に各メッセージに関連付けられます。これを行うための最良の方法は何ですか?

前もって感謝します。

編集

配列の例からわかるように、useridfrom=241の重複したuseridfrom要素が2回あります。これは、ユーザー241が2つのメッセージを送信したことを意味し、241の要素から3つのuseridがあった場合、それは彼/彼女が3つのメッセージを送信したことを意味します。私の目標は、useridfromを配列内のキーとして2つのグループ化することです。これにより、重複がなくなり、そのキーに関連付けられて、すべてのメッセージ(message)とメッセージが作成された時刻(timecreated)が得られます。

 [4]=>
  array(7) {
    ["id"]=>
    string(2) "46"
    ["useridfrom"]=>
    string(3) "241"
    ["useridto"]=>
    string(3) "139"
    ["message"]=>
    string(8) "sdsdfsdf"
    ["format"]=>
    string(1) "0"
    ["timecreated"]=>
    string(10) "1336139572"
    ["messagetype"]=>
    string(6) "direct"
  }
  [5]=>
  array(7) {
    ["id"]=>
    string(2) "47"
    ["useridfrom"]=>
    string(3) "241"
    ["useridto"]=>
    string(3) "139"
    ["message"]=>
    string(13) "8528528285285"
    ["format"]=>
    string(1) "0"
    ["timecreated"]=>
    string(10) "1336143958"
    ["messagetype"]=>
    string(6) "direct"
  }

 [1]=>
  array(7) {
    ["id"]=>
    string(2) "30"
    ["useridfrom"]=>
    string(3) "329"
    ["useridto"]=>
    string(3) "139"
    ["message"]=>
    string(243) "Hi Bob"
    ["format"]=>
    string(1) "0"
    ["timecreated"]=>
    string(10) "1330942044"
    ["messagetype"]=>
    string(6) "direct"
  }

したがって、この例から、mariomarioが提案したような一連の配列につながるはずです。

array{
  ['241'] => array(
   [0] => array(time=>'time1', message => "hello i am 241"),
   [1] => array(time=>'time2', message => "nice to meet you"),
),
['330'] => array(
       [0] => array(time=>'time1', message => "hello i am 330"),
       [1] => array(time=>'time2', message => "goodbye"),
    )
}
4

3 に答える 3

2

編集:

少し考えた後、私はこれを行います:

$data = array();

foreach ($json as $j) {
    if (!array_key_exists($j['useridfrom'], $data)) {
        $data[$j['useridfrom']] = array();
    }
    if (!array_key_exists($j['useridto'], $data[$j['useridfrom']])) {
        $data[$j['useridfrom']][$j['useridto']] = array();
    }
    $data[$j['useridfrom']][$j['useridto']][] = array(
        'message' => $j['message'],
        'timestamp' => $j['timecreated']  
    );
}

データORDER BY timecreated DESCをそのように並べたままにしておくと、時間後に並べ替えたいようにすべてが連結されます。

これにより、次のような配列が得られます。

'sender1' => (
    'recipient1' = (
        (
            'message' => 'MESSAGE HERE',
            'timecreated' => 'TIME HERE'
        ),
        (
            'message' => 'ANOTHER MESSAGE HERE',
            'timecreated' => 'ANOTHER TIME HERE'
        )
    ),
    'recipient2' = (
        (
            'message' => 'MESSAGE HERE',
            'timecreated' => 'TIME HERE'
        )
    )
),
'sender2' => (
)
于 2012-05-09T13:12:28.043 に答える
2

このようなことをしませんか

$newArray = array()

foreach($json as $j)
{
 $array[$j['useridfrom']][] = array('time'=>$j['timecreated'],
'message'=>$j[message]);
}

彼らは次のような配列を持っています:

array{
  ['user1'] => array(
   [0] => array(time=>'time1', message => message1),
   [1] => array(time=>'time2', message => message2),
),
['user2'] => array(
       [0] => array(time=>'time1', message => message1),
       [1] => array(time=>'time2', message => message2),
    )
}

しかし、多分私はあなたが正しくないことを理解している.

于 2012-05-09T12:28:05.277 に答える
0

PHP で array_multisort を使用します。

http://php.net/manual/en/function.array-multisort.php

于 2012-05-09T12:24:21.720 に答える