2

私がやろうとしているのは、同じタイプの結果を持つ2つの(現在は合計4つの配列になります)配列を取得し、それらをすべてまとめて、それらの値の1つ(post_time)で並べ替え、エコーします。そのソートされた順序で画面。

whileループを使用して、これらの結果を個々の結果/配列でエコーアウトすることはできますが、個々の配列内でのみ、合計で投稿時間によって正しく並べ替えられません。

ネストされたforeachループ間で混乱しています。私は自分が持っている2つの配列でarray_mergeを試し、その配列を別の配列に入れて、ループする数値キーを取得しましたが、行き詰まり、混乱し、疲れています。私は調査を行いましたが、私が見ている答えを私自身の特定のコードと比較することに頭を悩ませることはできません。

助けが必要です。これが私が持っているものです。これは、データベースから情報の個別のセット/配列を取得するコードです。

include 'db_connect.php';
include 'core.php';

$get_char = mysql_query("SELECT character_id FROM characters WHERE account_id = '".$_SESSION['user_id']."'");
$char = mysql_result($get_char,0,'character_id');

$get_location = mysql_query("SELECT current_location, x_cord, y_cord, inside_building FROM characters WHERE character_id = $char");
$location = mysql_result($get_location, 0, 'current_location');
$x = mysql_result($get_location,0, 'x_cord');
$y = mysql_result($get_location,0,'y_cord');
$inside = mysql_result($get_location,0,'inside_building');

//get all messages where current characters arrival time is less than post_time
//AND arrival location is the same as posting location
$get_arrival = mysql_query("SELECT * FROM arrive_exit WHERE character_id = $char ORDER BY arrival DESC");
while($arrivals = mysql_fetch_array($get_arrival)){
  $arrival = $arrivals['arrival'];
  $arrival_location = $arrivals['location'];
  $unix_arrival = strtotime($arrival);
  $exit = $arrivals['exit'];
  $unix_exit = strtotime($exit);
  if(!isset($exit)){
    $get_logs = mysql_query("SELECT character_id, log, post_time, event FROM character_logs WHERE UNIX_TIMESTAMP(post_time) >= $unix_arrival
    AND location = $arrival_location ORDER BY post_time DESC");
  }else{
    $get_logs = mysql_query("SELECT character_id, log, post_time, event FROM character_logs WHERE UNIX_TIMESTAMP(post_time) >= $unix_arrival
    AND location = $arrival_location AND UNIX_TIMESTAMP(post_time) <= $unix_exit ORDER BY post_time DESC");
  }
  $o_logs = mysql_fetch_array($get_logs);

  //CHECK FOR LOGS IN BUILDING LOGS
  if(!isset($exit)){
    $check_logs = mysql_query("SELECT * FROM building_logs WHERE UNIX_TIMESTAMP(post_time) >= $unix_arrival
    AND current_location = $arrival_location");
  }else{
    $check_logs = mysql_query("SELECT * FROM building_logs WHERE UNIX_TIMESTAMP(post_time) >= $unix_arrival
    AND current_location = $arrival_location");
  }
  $building_check = mysql_num_rows($check_logs);
  if($building_check >= 1){
    $get_room = mysql_query("SELECT room_id, building_current_id, building_id FROM building_logs WHERE character_id = $char");
    $room_id = mysql_result($get_room,0,'room_id');
    $building_current = mysql_result($get_room,0,'building_current_id');
    $building_id = mysql_result($get_room,0,'building_id');
    if(!isset($exit)){
      $get_logs = mysql_query("SELECT character_id, log, post_time, event FROM building_logs WHERE UNIX_TIMESTAMP(post_time) >= $unix_arrival
      AND current_location = $arrival_location AND x = $x AND y = $y AND room_id = $room_id ORDER BY post_time DESC");
    }else{
    $get_logs = mysql_query("SELECT character_id, log, post_time, event FROM building_logs WHERE UNIX_TIMESTAMP(post_time) >= $unix_arrival
    AND current_location = $arrival_location AND x = $x AND y = $y AND room_id = $room_id
    AND UNIX_TIMESTAMP(post_time) <= $unix_exit ORDER BY post_time DESC");
    }
    $b_logs = mysql_fetch_array($get_logs);
  }
}

取得した結果を操作するために使用しようとした、機能しないコードは次のとおりです。

$list = array_merge((array)$o_logs,(array)$b_logs);
$messages = array($list);
//echo out info here.
foreach($messages as $array){
  foreach($array as $log_key => $value){
    //log_key in this case could be character_id, event, post_time, so on which is not preferable
    echo $log_key.' : '.$value.'<br>';
    }
}

どの出力:

0 : 62
character_id : 64
1 : This is a testing log from a different person at an earlier time in a DIFFERENT location.
log : This is a log from inside a building now.
2 : 2013-02-22 04:04:00
post_time : 2013-02-26 19:00:00
3 : 0
event : 0
4 : 64
5 : This is a log from inside a building now.
6 : 2013-02-26 19:00:00
7 : 0

したがって、明らかに、内側のforeachループから文字列でもあるキーを取得しています。それらは2番目の「building_logs」クエリから来ています。上記のすばやく書き留められたループネストからの出力が、私が望んでいたものを正確に提供することを期待していませんでしたが、なぜそれが起こっているのかわかりません。

必要な情報を適切に取得するために、foreachループをネストする方法を理解するのに助けが必要です。1年以上コーディングしてきましたが、whileループ以外のループを処理する必要はほとんどなく、操作した配列は多次元ではなかったので、非常にありがたいです。

4

1 に答える 1

0

$row = mysql_fetch_array($result)DB からのすべての値が (1) 数値配列として、( 2) 連想配列として2 回含まれます。

(1)$row[0]="Hello"
(2)$row['text']="Hello"

... mysql_fetch_array($result,MYSQL_NUM)数値インデックスのみ
.. MYSQL_ASSOC)を取得するか、連想インデックスのみを取得してください。

array_merge...
"入力配列に同じ文字列キーがある場合、そのキーの後の値は前の値を上書きします。ただし、配列に数値キーが含まれている場合、後の値は元の値を上書きしませんが、添付。" http://www.php.net/manual/en/function.array-merge.php
からの引用

これは、あなたが得ている奇妙な結果を説明していると思います。

したがって、最初に を設定mysql_get_array($result,MYSQL_NUM)し、次に配列を にマージし、$list並べ替え (php.net を参照)、エコーします。

$messages = array($list);しかし、私にはあまり意味がありません。

var_dump($list);この配列がどのように構築されているかを理解するために実行してください。次に、それに応じてループを調整します。

ところで、mysql_* は非推奨であることを忘れていました。mysqli または PDO に移行してください。

于 2013-03-03T01:26:47.803 に答える