ホームページ >バックエンド開発 >PHPチュートリアル >Laravelフレームワークのilluminatesupportコレクションのソートの問題
たぶんそうだ 公開日 2015-04-03 00:59
Laravel のコレクションのソートに問題があって苦労しました。数日前、私は長い間、自分のコードに問題があるのではないかと常に疑っていました。 Collection オブジェクトは、sort を実行した後に、values メソッドを実行する必要があります。そうしないと、Collection オブジェクトの項目の並べ替え結果が反映されません。もちろん手動 toArray() も有効です。 PHP の uasort 関数を呼び出す Collection sort メソッドの内部実装を表示します。この関数は、ソート後に元のキー => 値の関係を維持します。
公式ドキュメントは次のように抜粋されています:
Collection values()Reset the keys on the underlying array.Return ValueCollection
このメソッドがなぜvaluesと呼ばれるのかはまだわかりません。この名前は内部でarray_valuesメソッドが使用されています。項目の割り当てを再構成するための値メソッド。場合によっては、開発は非常に面倒で、常に変更されます。コード スニペットは次のとおりです。並べ替えを有効にするには、values メソッドを呼び出す必要があります。
$left = $right = null;switch($sortby){ case "rating": case "month_sales": $left = -1; $right = 1; break; case "order_lead_time": case "minimum_order_amount": $left = 1; $right = -1; break;}if($ascending === "1"){ $left = 1; $right = -1;}elseif($ascending === "0"){ $left = -1; $right = 1;}$restaurants->sort(function($a, $b) use ($sortby, $left, $right){ return ($a->{$sortby} >= $b->{$sortby}) ? $left : $right;});$restaurants->values();
開発プロセス中に特にこだわりを持ったり、変数の名前やパラメーターのメソッドを気にしすぎたり、時期尚早にコードを最適化したりすることは良くありません。まったく同じビジネスを行う企業は世界中に 2 つと存在しないはずであり、オープンソース ソフトウェアを多用することが必ずしも良いとは限りません。ところで、伝説の Artisan についてコメントしたいのですが、エラーログに日付やエラーが発生した場所が表示されないので、デバッグ方法を尋ねました。
sortメソッドとvaluesメソッドの内部実装コード:
public function sort(Closure $callback){ uasort($this->items, $callback); return $this;}public function values(){ $this->items = array_values($this->items); return $this;}
読む(498) コメント(0) コメントを見る