8

私はこの形式の配列を持っています:

$array = [
    ['id' => 117, 'name' => 'Networking', 'count' => 16],
    ['id' => 188, 'name' => 'FTP', 'count' => 23],
    ['id' => 189, 'name' => 'Internet', 'count' => 48],
];

「カウント」列 (16および48それぞれ) の最小値と最大値を取得する良い方法はありますか?

いくつかのループを使用してこれを行うことができますが、より良い方法があるのではないかと思います。

4

7 に答える 7

5

他の人が投稿したものとは対照的に、これらの関数は渡されるデータ構造 (配列) を理解しないため、この問題にmin()/max()関数を使用することはできません。これらの関数は、スカラー配列要素に対してのみ機能します。


編集開始

min()と を使用すると正しい答えが得られるように見える理由は、未定義の動作max()である整数への型キャスト配列に関連しています。

整数への変換の動作は、他の型では未定義です。予告なしに変更される可能性があるため、観察された動作に依存しないでください。

型キャストに関する上記の私の発言は間違っていました。実際min()max()は、配列で動作しますが、OP が動作するために必要な方法ではありません。min()複数の配列または配列の配列でを使用する場合max()、要素は左から右に要素ごとに比較されます。

$val = min(array(2, 4, 8), array(2, 5, 1)); // array(2, 4, 8)
/*
 * first element compared to first element: 2 == 2
 * second element compared to second element: 4 < 5
 * first array is considered the min and is returned
 */

min()OPの問題に変換すると、これはand を直接使用するとmax()正しい結果が得られるように見える理由を示しています。配列の最初の要素は値であるidためmin()、最初にそれらを比較し、偶然max()にも正しい結果が得られます。idcountidcount

編集終了


正しい方法は、ループを使用することです。

$a = array(
        array('id' => 117, 'name' => 'Networking', 'count' => 16),
        array('id' => 188, 'name' => 'FTP', 'count' => 23),
        array('id' => 189, 'name' => 'Internet', 'count' => 48)
);
$min = PHP_INT_MAX;
$max = 0;
foreach ($a as $i) {
    $min = min($min, $i['count']);
    $max = max($max, $i['count']);
}
于 2009-08-28T07:24:03.467 に答える
0

max( )関数とmin()関数を使用できます。

于 2009-08-28T06:21:57.583 に答える
0

いくつかのループで何をしましたか?1つで十分です:)

  1. 最初の要素を取得し、カウントを$minと$maxの両方に割り当てます
  2. 残りを繰り返し、カウントを各$minおよび$maxと比較し、小さい/大きい場合は、新しいカウント値を割り当てます
于 2009-08-28T06:27:58.693 に答える
0

目的の列が配列の最初にある場合は、次のワンライナーを使用できます。

$max = max(array_map('current', $a));
$min = min(array_map('current', $a));

これにより、 IDの最小/最大が見つかります

于 2011-02-16T18:50:35.567 に答える
-1

その関数と同等の組み込み関数はありますか? (テスト機能がなくても)

/**
 * 2D 配列から列を抽出し、オプションで別の列を選択します
 *
 * @param $aArray から抽出する配列
 * @param $aColName 抽出する列の名前。「O_NAME」
 * @param $aColTest (オプション) テストを行う列の名前。「O_ID」
 * @param $aTest (オプション) テスト ex の文字列。">= 10", "=='".$toto."'"
 * 抽出された列のみを含む @return 1D 配列
 * @access public
 */

  関数 extractColFromArray($aArray, $aColName, $aColTest="", $aTest="") {
  $mRes = 配列();
  foreach($行としての$配列) {
   if (($aColTest == "") || (eval("return " . $row[$aColTest] . $aTest . ";" )) {
    $mRes[] = $row[$aColName];
   }
  }
  $mRes を返します。
 } // extractColFromArray
于 2009-10-07T08:17:01.563 に答える