2

以下のコードでは:

$sth = $dbh->query('SELECT DISTINCT title,courseId,location from training');  
$sth->setFetchMode(PDO::FETCH_ASSOC); 
$results = $sth->fetchAll();
$uu = array_unique($results);

echo "<pre>";
print_r($uu);
echo "</pre>";

から1つの結果しか得られませんprint_r($uu);

すべて(30以上)の行を削除するarray_uniqueと返されます。(いいえ、すべてが重複しているわけではありません):)

私は何が間違っているのですか?

結果の編集var_dump()

array(23) {
  [0]=>
  array(3) {
    ["title"]=>
    string(26) "String Here"
    ["courseId"]=>
    string(1) "8"
    ["location"]=>
    string(1) "1"
  }
  [1]=>
  array(3) {
    ["title"]=>
    string(26) "Another String Here"
    ["courseId"]=>
    string(1) "8"
    ["location"]=>
    string(1) "2"
  }
  [2]=>
  array(3) {
    ["title"]=>
    string(24) "Third String Here"
    ["courseId"]=>
    string(1) "5"
    ["location"]=>
    string(1) "2"
  }

等...

4

4 に答える 4

5

私の理解でarray_uniqueは、配列を再帰的に繰り返すことはありません。$uu === array()したがって、キーを保持しながら、1つを除くすべての値を削除するすべての値が表示されます。結果としてキーが常に0であっても、私は驚かないでしょう。

マニュアルでは、注を参照してください。

array_unique()は、多次元配列で機能することを目的としていないことに注意してください。

于 2012-08-22T20:40:41.333 に答える
2

マニュアルから:

注:array_unique()は、多次元配列で機能することを目的としていないことに注意してください。

さらに遠く:

注:(string)$ elem1 ===(string)$ elem2の場合に限り、2つの要素は等しいと見なされます。つまり、文字列表現が同じ場合。

配列が文字列にキャストされると、「配列」が得られます。


array_uniqueとにかくなぜあなたは呼んでいるのですか?あなたのデータベースはすでに一意性を保証しています。

詳細はよくわかりませんが、これはあなたが望むもののようです。まだ自分でSQLを学んでいます。

SELECT title, courseId, location
FROM training
GROUP BY title;
于 2012-08-22T20:44:17.563 に答える
1

キーワードは、DISTINCT1つのフィールドだけでなく、行全体に作用します。追加DISTINCTとは、結果セットの各行が(他の行と比較して)一意になることを意味します。行がすべてのフィールドではなく、一部のフィールドを共有する可能性があります。

于 2012-08-22T20:55:30.760 に答える
0

array_unique()は、文字列表現によってアイテムを比較します。マニュアルノートとして、

(文字列)$ elem1 ===(文字列)$ elem2の場合に限り、2つの要素は等しいと見なされます

配列の文字列変換では常に「Array」が生成されるため、PHPはすべてのアイテムが同じであると見なし、array_unique()は1つのアイテムのみを返します。

これを回避するには、おそらくin_array()を確認して、独自の関数を作成する必要があります。行はデータベースからのものであるため、一意の行のみが返されるようにSQLを作り直すことができるはずです。

于 2012-08-22T20:49:33.880 に答える