2016-05-24 25 views
0

dbからデータを取得しています.SQLクエリとarray_map()をループして適切な値を取得しています。php array_mapが配列を正しくマッピングしていません

$CompleteData = array(); 

foreach ($Details as $d) { 
    $q = "SELECT " 
     . "`log`.`id` AS 'id', " 
     . "DATE_FORMAT(`log`.`timestamp`, '%d %b %Y %h:%i:%s %p') AS 'timestamp', " 
     . "`log`.`Author` AS 'Author', " 
     . "`log`.`message` AS 'message', " 
     . "`log`.`bookname` AS 'bookname' " 
     . "FROM `log` " 
     . "WHERE `log`.`detailId` = '" . $d . "' " 
     . "ORDER BY `log`.`timestamp` DESC, `log`.`id` DESC"; 

    $qr = mysql_query($q, $sql); 
    for ($i = 0; $i < mysql_num_rows($qr); ++$i) { 
     $LogId[$i] = mysql_result($qr, $i, 'id'); 
     $LogTimestamp[$i] = mysql_result($qr, $i, 'timestamp'); 
     $LogAuthor[$i] = mysql_result($qr, $i, 'Author'); 
     $LogMessage[$i] = mysql_result($qr, $i, 'shortmessage'); 
     $Logbookname[$i] = mysql_result($qr, $i, 'bookname'); 
    } 

    $CompleteData[$d] = array_map(null, $LogId, $LogTimestamp, $LogAuthor, $LogMessage, $Logbookname); 
} 

ここで、array_mapは必要に応じてデータをマッピングしていないため、出力は折りたたまれています。

DBにログインテーブル:

enter image description here

所望の出力:

enter image description here

しかしarray_map(null,array1,arrar3..)で出力が

enter image description here

以下のようなものです

1番目の配列と2番目の配列などを組み合わせています。

私はアレイマップで間違っていると教えてもらえますか?

+0

あなたは、配列を変更していないので、なぜあなたはarray_mapを使用していますか?連想配列はあなたの目的のために働くでしょうか?インデックスの代わりにカラム名を持つ配列を返します。 – geekasso

+0

'array_map'と' for'は必要ありません。@MateiMihaiの答えを見てください。しかし、あなたのコードの問題は、 '$ LogId'や' $ LogTimestamp'のような配列を空にしていないので、最初の繰り返しの項目も含まれることです。 –

答えて

2

本当に間違っていると思います。

まず私はmysql_機能が廃止されましたことをお知らせしたいと思いますし、それがPDOmysqli_関数やMySQLiクラスを探して、より良いスタートだと、当然のことながら、文を作成しました。次のように何をしようとする

を簡略化することができます。

$query = "SELECT " 
    . "`log`.`id` AS 'id', " 
    . "DATE_FORMAT(`log`.`timestamp`, '%d %b %Y %h:%i:%s %p') AS 'timestamp', " 
    . "`log`.`Author` AS 'Author', " 
    . "`log`.`message` AS 'message', " 
    . "`log`.`bookname` AS 'bookname' " 
    . "FROM `log` " 
    . "WHERE `log`.`detailId` IN ('" . implode("', '", $Details) . "') " 
    . "ORDER BY `log`.`timestamp` DESC, `log`.`id` DESC"; 

$stmt = mysql_query($query); 

$CompleteData = array(); 

while ($row = mysql_fetch_array($stmt)) { 
    if (!isset($CompleteData[$row['detailedId']])) { 
     $CompleteData[$row['detailedId']] = array($row); 
    } else { 
     $CompleteData[$row['detailedId']][] = $row; 
    } 
} 

はなぜこの方法が良いですか?あなたは、すべてのログの情報を取得するために、単一のクエリを実行している

  1. 実行は、コードをより読みやすく、
  2. を理解するのは簡単です
  3. 速くなりますように、コードの複雑さが小さいです

その後編集:

あなた$Details変数を使用すると、を使用することができますオブジェクトの配列である場合

"WHERE `log`.`detailId` IN ('" . implode("', '", $detailsIds) . "') 
+1

キーが 'detailId'であるべきではないと言いたいのですか?あなたは私にそれを打つ! –

+1

私は短い見直しの後に間違いを見た: –

+0

@MateiMihai ,,,そのような良い答えをありがとう。もし '$ Details'が詳細を持っていなければ...もしそれが何らかのデータを持つ配列オブジェクトならば? '$ Details-> detailsId'のような詳細しか得られないようにする必要があります。 – Nithya

0

私は連想配列をフォーマットするだろうと思います。ここで、文を作成するために、あなたは、配列を使用することができ、IDSの詳細を持つ

$detailsIds = array_map(function ($item) { 
    return $item->detailsId; 
}, $Details); 

:は、クエリで使用する必要がある唯一の情報を取得しますアレイマップを使用しなくても列を使って応答できます。

Associative array

関連する問題