1

次のような連想配列があります

array
{
    [company 1]=>array
                      (
                        [1981] => 1
                        [1945] => 3
                      )
   [company 2]=>array
                    (
                       [1990] => 18
                       [2005] => 13
                    )
   [company 3]=>array
                    (
                       [1950] => 6
                       [2012] => 9
                    )
}

最低キーと最高キー、つまり 1945 年と 2012 年を取得したいのですが、どうすればこれを達成できますか? 私はすでにstackoverflowを検索しており、連想配列のHightest値が 最も近い可能性がありますが、最小値と最大値が得られ、最小値と最大値のキーが必要です。

** foreach ループは使いたくない **

4

4 に答える 4

5

あなたが本当に嫌いならforeach、ここに解決策があります:

$arr = array(
  "Company 1" => array(
    "1981" => 1,
    "1945" => 3
  ),

  "Company 2" => array(
    "1990" => 18,
    "2005" => 13
  ),

  "Company 3" => array(
    "1950" => 6,
    "2012" => 9
  )
);


$arr = array_map("array_keys", $arr);
$arr = array_reduce($arr, "array_merge", array());

あなた$arrは次のようになります:

Array
(
    [0] => 1981
    [1] => 1945
    [2] => 1990
    [3] => 2005
    [4] => 1950
    [5] => 2012
)

min()関数とmax()関数を使用するかsort()、最高値と最低値を簡単に取得できるようになりました。

sort($arr);
echo end($arr); /*highest value; actual output: 2012*/
echo reset($arr); /*lowest value; actual output: 1945*/
于 2012-11-15T07:27:01.163 に答える
1

これを試してください:
foreach を使用します。

        $array = array("company 1" => array(1981 => 1, 1945 =>3),
                        "company 2" => array(1990 => 18, 2005 => 13),
                        "company 3" => array(1950 => 6, 2012 =>9),
        );

        $keys = array();
        foreach($array as $arr)
        {
            foreach( array_keys($arr) as $val)
            {
                array_push($keys, $val);
            }
        }
        sort($keys);
        $min = $keys[0];
        $max = $keys[count($keys)-1];

foreach なし:

        global $keys;
        $GLOBALS['keys'] = array();
        function sortme($arr)
        {
            is_array($arr)? array_map("sortme",array_keys($arr)): array_push($GLOBALS['keys'], $arr);

        }
        array_map("sortme",$array);
        sort($GLOBALS['keys']);
        $min = $GLOBALS['keys'][0];
        $max = $GLOBALS['keys'][count($GLOBALS['keys'])-1];
        echo "min = ".$min . "<br/>max = ".$max;
于 2012-11-15T07:20:22.850 に答える
0
ksort($array);
$min = reset($array);
end($array);
$max = key($array);

編集:これは単純な配列で機能します。2 レベルの構造があるため、ループを回避することはほとんど不可能です。

ただし、エントリが多すぎて foreach でさえ遅すぎる場合は、おそらくアプローチを再考する必要があります。たとえば、このリストをデータベースに入れ、SQL を使用して面倒な作業を行います。

どのように正確に?MySQL または PostgreSQL のインスタンスをセットアップし (個人的には多くの理由で Postgres を好みます)、データベースを作成し、次のような構造のテーブルを作成します。

CREATE TABLE mytable (
    mytable_id INTEGER PRIMARY KEY,
    company VARCHAR(16),
    year INTEGER,
    value INTEGER,
    -- put some more metadata...
)

技術的には、データベースを正規化し、すべてのオブジェクト (会社、顧客、注文などのテーブルなど) ごとに個別のテーブルを作成する必要がありますが、これは後で行うことができます。

検索する列 (年、会社など) にインデックスを作成します。

CREATE INDEX mytable_year_idx ON mytable (year);
...

最後に、PHP スクリプトでデータベースに接続し、次のように必要なものをクエリします。

SELECT min(year) AS min_year,
       max(year) AS max_year
FROM mytable
于 2012-11-15T07:16:41.243 に答える