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,关联数组 的最高值是最接近的可能性,但它给出了最小值和最大值,我想要最小值和最大值键。

**我不想使用 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 回答
0

因为您的输入数组“非常大”并且“消耗 [a] 很多时间”,这正是使用一组简单的语言结构来一次遍历数据集的理由。

使用多个数组函数可能看起来更简洁或更聪明,但它们会多次传递数据,并且总是会占用比绝对必要更多的资源。

因为您的数据处理的是年份,所以您可以使用“幻数”将业务逻辑构建到代码逻辑中——假设您永远不会遇到负年份或 10,000 及以上的年份。

如果您想要一种更与业务无关的方法,您可以通过将第一行移出输入数组并获取该子数组的 min 和 max 键来播种默认的 min 和 max 值。

幻数代码:(演示

$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.

这些技术都没有使用迭代函数调用,因此几乎可以保证它们比函数式技术执行得更快。

于 2020-03-12T22:05:13.167 回答