skgt123
@skgt123 (勉強 わかば)

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

多次元配列のMAX値を特定して出力する方法

Q&A

Closed

解決したいこと

・多次元配列のキーを指定、MAX値の出力
・特定したMAX値が含まれる配列を出力

以下、具体的に書きます。下記コードと合わせて参照ください。

//
対象配列3つ
VideoSize0、VideoSize1、VideoSize2

max値を特定するキー
"bitrate"(この値を比較したい)

出力したい配列のキー
"url"(この値を出力したい)
//

対象配列3つの内、キー"bitrate"の値が最も大きい配列を特定して、
その"bitrate"のmax値を持つ配列から、キー"url"の値を出力したい。

該当するソースコード

<?php

$VideoSize0 = [
"bitrate" => 1000,
"url" => "hogehoge0"
];

$VideoSize1 = [
"bitrate" => 1100,
"url" => "hogehoge1"
];

$VideoSize2 = [
"bitrate" => 1200,
"url" => "hogehoge2"
];

$VideoSize = [$VideoSize0, $VideoSize1, $VideoSize2];

print_r (array_column ($VideoSize, "bitrate"));

echo "MAX:" .max(array_column ($VideoSize, "bitrate")). "ビットレート";

?>

自分で試したこと

解決したいことの一つ目
「 ・多次元配列のキーを指定、MAX値の出力 」については、
「 max(array_column ($VideoSize, "bitrate")) 」こちらでMAX値を出力することができました。
他にも方法を調べて見つけましたが、分かり易いコードを選びました。

解決したいことの二つ目
「 ・特定したMAX値が含まれる配列を出力 」については、
if文や関数を使った方法を模索しましたが、見つかりませんでした。

よろしくお願いします。

1

1Answer

見通し良く解くならこんな感じでしょうか。

$bitrates = array_column($VideoSize, "bitrate");
$maxBitrate = max($bitrates);
$index = array_search($maxBitrate, $bitrates);
$maxItem = $VideoSize[$index];
$url = $maxItem["url"];

ただし上記は、array_column,max,array_search で都合3回配列を走査するので、やや効率は悪いです。

一回の走査で目的のものを見つけるなら↓

ループ版
$maxItem = $VideoSize[0];
for ($i = 1; $i < count($VideoSize); $i++) {
    if ($VideoSize[$i]["bitrate"] > $maxItem["bitrate"]) {
        $maxItem= $VideoSize[$i];
    }
}
$maxBitrate = $maxItem["bitrate"];
$url = $maxItem["url"];
array_reduce版
$maxItem = array_reduce($VideoSize, function($carry, $item) {
    if ($item["bitrate"] > $carry["bitrate"]) {
        return $item;
    } else {
        return $carry;
    }
}, $VideoSize[0]);
$maxBitrate = $maxItem["bitrate"];
$url = $maxItem["url"];
0Like

Comments

  1. @skgt123

    Questioner

    丁寧な回答ありがとうございます。
    反応に時間がかかってしまいすみません。いただいた回答で望んだ結果が実行されました!感謝します。

    回答の一つ目確認しました。
    ・array_column($VideoSize, "bitrate") 多次元配列から単一のカラムを取り出す
     ⇒$VideoSizeの配列内からキー"bitrate"の値を取り出す
    ・max($bitrates); 上で取り出した値から最大値を取得
    ・array_search($maxBitrate, $bitrates); 配列の値を検索、要素番号を返す
     ⇒$bitratesの値 3つから、$maxBitrate 値の最大値を検索
     ⇒最大値の要素番号が返る
    ・$VideoSize[$index] 上の要素番号を利用する
     ⇒読み替えると、$配列名[要素番号] となる
    ・$maxItem["url"] 最後に上の結果をさらに利用する
     ⇒読み替えると $配列名[要素番号][キー名] となる


    回答の一つ目は、触れたことのあるコードで初学レベルの私にも理解し易いものでした。
    簡単なコードでも扱い方次第で、出来ることは色々あるんですね。

    回答の二つ目、三つ目については、どのような処理の過程で結果が出力されたのか。理解が足りないため時間をかけて確認したいと思います。
    表題の通り「ループ版」条件文をループさせるもの、「array_reduce版」コールバック関数を反復処理させて配列をひとつの値にまとめるもの。処理を一つづつ確認してみます。

    ベストアンサーと感じましたので質問はクローズいたします。

Your answer might help someone💌