なぜですか?どうしたらいいですか?
今回はこのような疑問に答えていきます。
結論:ソートに使う引数が配列でない
結論から話すと、このエラーが出る場合は引数が配列になっていない可能性があります。
実際のコードは次のような感じだとします。
$datas = $this->messageService->getAllMessage($userId);
//メッセージを送信日昇順にソート
$sort = [];
foreach ($datas as $key => $value) {
$sort[$key] = $value->id;
}
if (isset($sort)) {
array_multisort($sort, SORT_ASC, $datas);
}
こちらのコード自体には問題はありません。
にも関わらず「array_multisort(): Argument #3 must be an array or a sort flag」というエラーがでるのは、引数として渡している「$sort」か「$datas」に問題ありです。
配列になっているかチェックする方法
配列ではない疑いがある変数に対して、is_array()メソッドを使って、確かめてみましょう。
コードは次のとおりです。
if(!is_array($datas)){
dd('not array'); //Laravelで試しているので、dd()でログを出しています。それぞれの環境に合わせて出力してください。
}
上記コードで、「not array」が表示されたら、今一度配列になっているかをチェックしましょう。
考えられるケース①$sortが配列になっていない
$sortが配列になっているか確認しましょう。
また、初期値の設定で
$sort = [];
のようにしておくと安心です。
考えられるケース②$datasが配列になっていない
$datasが配列になっているか確かめましょう。
Laravelの場合は、クエリビルダを使ってデータを取得する場合、配列で返させるには「->all()」または「->toArray()」を使う必要があります。
取得時のコードを載せておきます。
以下のような感じです。
$datas = DB::table('messages')
->select( 'messages.id', 'messages.user_id as target_id')
->orderBy('messages.created_at', 'desc')
->get()->all(); //ここで配列化
自分はここで少しハマりましたね...。
ちなみに、単純に取得したデータを配列で返したい場合はall()で良いと思います。
ということで、今回は、PHPでarray_multisort()を使ったときに出るエラーについての解説でした。
参考になれば幸いです。