【PHP】カウントダウン機能に使える?array_reverseで配列要素を逆に,パラメーター挙動&array_flipとの違い

今回は、管理人がYouTubeData APIの、order=desc/ascが無いパラメータの場合でも、再生回数カウントダウンを作ろうとして、PHPで配列要素の順番を逆転というのをやってみたので、その様子をお伝えします。API自体は読み込みオーバーで失敗しましたが、PHPの関数array_reverseなどについて、挙動を見ていってみましょう

array_reverseとは?なんか似てるarray_flipとの挙動の違いは?

PHP(対応バージョン4,5,7,8)に用意されている関数で、英単語の意味の通り、『配列の要素を逆並びにする』というものです。使い方は配列が入っている変数を渡せばok。パラメーターには、数値のキーを保持するかどうかという『preserve_keys(bool型・true/false)』があります。

また、似たような関数だけど挙動が違うarray_flip(配列のキーと値を反転)というのもあります。文字列や数値が混合している配列などだとややこしくなるので、上記のパラメーターと共に押さえておくと良いでしょう。

PHP・array_reverse、preserve_keysパラメータあり/無し挙動を確認

array_reverse、preserve_keys無し(またはfalse)


まずは、通常の配列を作っておきます。キー[0]が数値0とか1だとややこしいので、映画かなんかのキャラ名にしましょうか。
最初の要素キー[0]の場合、値は『グルーベルさん』というような配列です。その下はこれをarray_reverseしたものです。preserve_keysパラメータは与えていませんが、この状態はfalseと判定されます。


パラメータ無しのarray_reverseの場合は、出力がこんな形になりました。最初の要素キー[0]の値が、リーゼロッテさんになりましたね。『キー/値関係』もかわっており、上でキー[0]を『print_r($arr1[0]);』で出すとグルーベルさんが出ますが、下で『print_r($reversed[0]);』すると、リーゼロッテさんが出てきます。

array_reverse、preserve_keys(数値のキーを保持)がtrueの場合


次に、array_reverseにpreserve_keysパラメーターtrueを指定してみましょう。こんな感じでtrue/falseを指定。


この場合は、『キー/値関係』は保持したまま並び替えがされます。この状態だとリバース状態を『print_r($reversed[0]);』しても、値は『グルーベルさん』が出てくるようになります。管理人はまだ当たったことがありませんが(または忘れているだけ?)、キー/値関係が固定されていないと、意図しない結果になることもあります。

おまけ・array_flip で 配列のキーと値を反転するとどうなる?


おまけで、名前が似ているけど挙動が違うarray_flipを使ってみましょう。コードの書き方はだいたい一緒。ただしPHPマニュアルを確認したところ、値保持みたいなパラメータがなく、元の配列に同じ値が複数ある場合、反転してキーになったときカットされるみたいな挙動も(注意)。


上の例では人名が値だったのに、array_flipかけると、人名がキーになってしまいました。この状態で『print_r($flipped[0]);』とかやっちゃうと、『Undefined offsetエラー』になって何も出ません。キーがかわっちゃっているので、キー[0]を指定しても、なにもないからです。

管理人がPHPのarray_reverseでやろうとしてたこと→YouTubeData API・Searchリソースにorder=desc/ascがないからカウントダウンに


で、なぜarray_reverseしようかと思っていたかというと、『YouTubeData APIでカウントダウン(リストの再生回数が少ないほうから表示していく)』をやりたかったからです。

というのも、Search: listリソースで指定できるパラメーターにorder viewCount(リソースを再生回数の多い順に並べる)というのはあるけど、『10件取ったら再生回数の多いほうから10件表示』みたいな感じになり、カウントダウンTVみたいに『リスト10件の中で、再生回数が少ないほうから』とならないからです

データベースのクエリとか、WordPressの並び替えだとorder=desc/ascが使えるんですが、なにか配列操作が必要という感じでした。あと、array_reverseする配列を『$videoarr["items"]』みたいにキーしている理由についてですが、$videoarrを直接渡すと、itemsの並び替えが行われないからです(多次元配列の中身まではリバースしない)。

これについては、urlパラメータなどで指定など、良い方法・良いコードがほかにあるかもしれませんので調査・学習します。

あとがき・まとめ

  • array_reverseは要素を逆順にした配列に、array_fliは配列のキーと値を逆転
  • array_reverseにpreserve_keysパラメーターtrueだと、『キー/値関係』が保持できる
  • array_flipでは元の配列に同じ値が複数ある点や、キー指定出力がある場合などは注意
  • array_reverseでは多次元配列の中身まではリバースしない

まとめるとこんなところでした。現在SSF(著作権フリー曲素材サイト)ように、カウントダウン表示用の機能を作っていてこのファンクションを使っています。挙動やパラメータなどに気をつけつつ使っていきたいと思います。

コメントを残す

メールアドレスが公開されることはありません。