[英]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.