foreach覆盖消息数据php的每次迭代

时间:2014-10-18 19:05:16

标签: php mysql arrays

我正在获取消息的mySQL数据内容,然后我按用户对其进行排序以创建一般消息数组。

IDEA喜欢如此:

 Array(
    ["Mr.EasyBB"] => Array(
                    [0] => array(//message data here)
                    [1] => array(//message data here)
                    ...
                  );
 );
到目前为止

PHP

 $messages = $controller->loadResult(
     "SELECT * FROM messages WHERE from_username='$username' AND from_uid='$uid'"
     );
 if($messages){
    foreach($messages as $data){
       $to_username = strtolower($data["to_username"]);
          if(!in_array($to_username,$conversations)){
              $conversations[$to_username] = array();
          } 
         $conversations[$to_username][]= $data;
    }

虽然我的输出是

 Array
 (
  [ianbruce] => Array
      (
        [0] => Array
            (
                [0] => 231
                [to_uid] => 231
                [1] => 0001
                [from_uid] => 0001
                [2] => IanBruce
                [to_username] => IanBruce
                [3] => Mr.EasyBB
                [from_username] => Mr.EasyBB
                [4] => n
                [deleted] => n
                [5] => n
                [sent_deleted] => n
                [6] => Howdy Again my Friend
                [message] => Howdy Again my Friend
                [7] => 2014-10-18 00:01:04
                [to_timestamp] => 2014-10-18 00:01:04
                [8] => 0000-00-00 00:00:00
                [from_timestamp] => 0000-00-00 00:00:00
                [9] => y
                [from_seen] => y
                [10] => n
                [to_seen] => n
            )
        )
    )

现在我知道它会覆盖用户内部的数组,或者它会覆盖用户,使其显示数组的最后一次推送。不知道我在这里做错了什么,并认为一双新眼睛可能会有所帮助。

1 个答案:

答案 0 :(得分:4)

您的问题是由使用in_array()引起的。该函数检查要在数组中设置的,而不是

你需要替换它:

if(!in_array($to_username,$conversations)){

有这样的事情:

if(!isset($conversations[$to_username])){

您还可以使用key_exists()等功能,但您可能根本不需要此条件,因为即使$conversations[$to_username][]不存在,您也可以设置$conversations[$to_username]