簡體   English   中英

在關聯數組中查找最大和最小鍵

[英]Find max and min key in associative array

我有像這樣的關聯數組

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循環**

如果你真的討厭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*/

試試這個:
使用 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;
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

因為您的輸入數組“非常大”並且“消耗 [a] 很多時間”,這正是使用一組簡單的語言構造在單次傳遞中迭代數據集的理由。

使用多個數組函數可能看起來更簡潔或更聰明,但它們會對數據進行多次傳遞,並且總是會占用比絕對必要更多的資源。

因為您的數據處理年份,所以您可以將業務邏輯構建到帶有“幻數”的代碼邏輯中——假設您永遠不會遇到負年份或 10,000 及以上的年份。

如果您想要一種與業務無關的方法,您可以通過將第一行移出輸入數組並獲取該子數組的最小和最大鍵來設定默認的最小值和最大值。

幻數代碼:(演示

$minYear = 9999;
$maxYear = 0;
foreach ($array as $row) {
    foreach ($row as $year => $value) {
        if ($year > $maxYear) {
            $maxYear = $year;
        }
        if ($year < $minYear) {
            $minYear = $year;
        }
    }
}
echo "MinYear = $minYear, MaxYear = $maxYear";
// MinYear = 1945, MaxYear = 2012

移位默認代碼:(演示

if ($array) {
    $firstKeys = array_keys(array_shift($array));
    $minYear = min($firstKeys);
    $maxYear = max($firstKeys);
} else {
    $minYear = null;
    $maxYear = null;
}
foreach ($array as $row) {
    foreach ($row as $year => $value) {
        if ($year > $maxYear) {
            $maxYear = $year;
        } elseif ($year < $minYear) {
            $minYear = $year;
        }
    }
}
echo "MinYear = $minYear, MaxYear = $maxYear";

請注意, Shifted 片段專門處理第一個數據集以獲取默認值 - 這需要一些額外的行 - 但由於elseif具有更高的潛在效率。

這些技術都沒有使用迭代函數調用,因此它們幾乎可以保證比函數式技術執行得更快。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM