2

ArrayableInterfaceを実装するオブジェクトがあります(BTW、LaravelのEloquent ORMからのものです)。

このオブジェクトは$articlesです。だから当然、私はこれを行うことができます:

foreach ($articles as $article)
    echo $article->title . "<br/>";

しかし、私はこれを行うことはできません:

shuffle($articles);

shuffle() expects parameter 1 to be array, object given警告が表示されます。

4

2 に答える 2

3

いいえ、バグではありません。

PHP 5では、foreach()配列ではないオブジェクトをループするために使用できます。これらのオブジェクトはと呼ばれIteratorsます。

残念ながら、のような古い配列ベースの関数はshuffle()イテレータを処理できません。

foreach()これの主な理由は、イテレータがソート可能でさえない可能性があることです。たとえば、ファイルまたはURLから直接読み取り、ループが繰り返されるたびに新しいデータ行を読み取るイテレータを使用できます。foreach()これはプロセス中に読み取られるため、明らかに並べ替えることはできません。

巧妙な名前の関数を使用して、イテレータを配列に変換できiterator_to_array()ます。ただし、イテレータが大量のメモリを使用していることがわかる場合があるため、イテレータが処理するデータの量がわからない場合、これは悪い考えかもしれません。

一部のイテレータは、データを並べ替えたりフィルタリングしたりするために、イテレータオブジェクト自体にメソッドを提供する場合があります。もしそうなら、これは配列としてソートしようとするよりも良い解決策です。

ORMを使用している場合、これはIteratorオブジェクトがDBからデータを読み取っていることを意味します。この場合、DBクエリ(つまりORDER BY、ORMがそれを行うために提供する任意のメソッド)を介してソートする方が、PHPでデータをソートするよりもおそらく優れたソリューションになります。

于 2013-02-04T17:32:39.777 に答える
2

インターフェイスが何をするのかわかりませんが、配列しか認識しないため、シャッフル機能もありません。これを行う必要があります:

$array = iterator_to_array($articles);
$shuffled = shuffle($array);

OOPの観点からは、実際には、オブジェクトにはシャッフル実装が含まれている必要があります。

 $articles->shuffle();
于 2013-02-04T17:26:57.570 に答える