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

      2021/05/28   2719文字

今回は、管理人が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(著作権フリー曲素材サイト)ように、カウントダウン表示用の機能を作っていてこのファンクションを使っています。挙動やパラメータなどに気をつけつつ使っていきたいと思います。


【カテゴリ】 - PHP・データベースetc
【タグ】 - ,

  関連記事

PHP・shuffleやarrayを使った、画像ランダム表示方法~メインビジュアルやバナー・テキストにも利用可能
WordPress記事一覧ページの『本文からの抜粋』を表示する関数と、その文字数の調整方法をチェックする
【WP記事取得クエリ・プラグイン無し】お知らせなどに使える、ショートコードで特定カテゴリ記事を表示プログラム
WordPressの記事IDで判定して転送~PHP・headerとget_the_IDで対応、the_IDとの挙動の違いも
WordPress一覧表示で、特定のカテゴリ/投稿を表示しないようにするには?→category_not_in・post_not_inで
WordPress・REST APIのjsonファイルにカスタムフィールドを入れ、タイトル・アイキャッチと共に外部サイトで取得・表示
テスト環境(ローカル含む)でPHPサイト開発に使えるツール&xamppでやってみた例(設定や表示ファイルetc)
侍エンジニア塾ブログにあったPHPコードをシンプルに書いてみる(foreachで配列キーや値取得・continueで空要素スキップ)
【画像つきでわかりやすい】WordPressで使われるデータは、MySQLデータベースに、どのように格納されているの?
【PHP学習】var_dumpで出力するのと、echoで出力するのは、挙動がどのように違うの?
【PHP etc.プログラム学習サイトコードコピペ】全角引用符・バッククオートが入ってて動かない件に注意
【WordPressでPHPプログラムを学習シリーズ1】用語:PHP変数・関数・定数を、WPの機能を通して覚える