Php 在关联数组中查找最大和最小关键点
我有像这样的关联数组Php 在关联数组中查找最大和最小关键点,php,arrays,associative-array,Php,Arrays,Associative Array,我有像这样的关联数组 array { [company 1]=>array ( [1981] => 1 [1945] => 3 ) [company 2]=>array ( [1990] =&
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循环**
ksort($array);
$min = reset($array);
end($array);
$max = key($array);
编辑:
这适用于简单数组。你有两个层次的结构,所以几乎不可能避免循环通过它 然而,如果您有如此多的条目,甚至foreach也太慢,那么您可能应该重新考虑您的方法。例如,将此列表放入数据库,并使用SQL为您完成繁重的工作 到底是怎么回事?MySQL或PostgreSQL的安装实例我个人比较喜欢Postgres,原因很多,创建数据库,创建表,结构如下:
CREATE TABLE mytable (
mytable_id INTEGER PRIMARY KEY,
company VARCHAR(16),
year INTEGER,
value INTEGER,
-- put some more metadata...
)
SELECT min(year) AS min_year,
max(year) AS max_year
FROM mytable
Array
(
[0] => 1981
[1] => 1945
[2] => 1990
[3] => 2005
[4] => 1950
[5] => 2012
)
从技术上讲,您应该规范化您的数据库,并为每个对象创建单独的表,如公司表、客户表、订单表等,但您可以稍后再讨论
在要搜索的列上创建索引,如年份、公司等:
CREATE INDEX mytable_year_idx ON mytable (year);
...
最后,在PHP脚本中,连接到数据库并查询所需内容,如下所示:
CREATE TABLE mytable (
mytable_id INTEGER PRIMARY KEY,
company VARCHAR(16),
year INTEGER,
value INTEGER,
-- put some more metadata...
)
SELECT min(year) AS min_year,
max(year) AS max_year
FROM mytable
Array
(
[0] => 1981
[1] => 1945
[2] => 1990
[3] => 2005
[4] => 1950
[5] => 2012
)
编辑:
这适用于简单数组。你有两个层次的结构,所以几乎不可能避免循环通过它 然而,如果您有如此多的条目,甚至foreach也太慢,那么您可能应该重新考虑您的方法。例如,将此列表放入数据库,并使用SQL为您完成繁重的工作 到底是怎么回事?MySQL或PostgreSQL的安装实例我个人比较喜欢Postgres,原因很多,创建数据库,创建表,结构如下:
CREATE TABLE mytable (
mytable_id INTEGER PRIMARY KEY,
company VARCHAR(16),
year INTEGER,
value INTEGER,
-- put some more metadata...
)
SELECT min(year) AS min_year,
max(year) AS max_year
FROM mytable
Array
(
[0] => 1981
[1] => 1945
[2] => 1990
[3] => 2005
[4] => 1950
[5] => 2012
)
从技术上讲,您应该规范化您的数据库,并为每个对象创建单独的表,如公司表、客户表、订单表等,但您可以稍后再讨论
在要搜索的列上创建索引,如年份、公司等:
CREATE INDEX mytable_year_idx ON mytable (year);
...
最后,在PHP脚本中,连接到数据库并查询所需内容,如下所示:
CREATE TABLE mytable (
mytable_id INTEGER PRIMARY KEY,
company VARCHAR(16),
year INTEGER,
value INTEGER,
-- put some more metadata...
)
SELECT min(year) AS min_year,
max(year) AS max_year
FROM mytable
Array
(
[0] => 1981
[1] => 1945
[2] => 1990
[3] => 2005
[4] => 1950
[5] => 2012
)
试试这个:
使用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;
试试这个:
使用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;
如果你真的讨厌foreach,这里有一个解决方案:
$arr=数组
公司1=>阵列
1981 => 1,
1945 => 3
,
公司2=>阵列
1990 => 18,
2005 => 13
,
公司3=>阵列
1950 => 6,
2012 => 9
;
$arr=数组\映射数组\键,$arr;
$arr=array\u reduce$arr,array\u merge,array;
您的$arr将以如下方式结束:
CREATE TABLE mytable (
mytable_id INTEGER PRIMARY KEY,
company VARCHAR(16),
year INTEGER,
value INTEGER,
-- put some more metadata...
)
SELECT min(year) AS min_year,
max(year) AS max_year
FROM mytable
Array
(
[0] => 1981
[1] => 1945
[2] => 1990
[3] => 2005
[4] => 1950
[5] => 2012
)
现在,您可以使用min和max函数,或者对其进行排序,以轻松获得最高值和最低值
sort($arr);
echo end($arr); /*highest value; actual output: 2012*/
echo reset($arr); /*lowest value; actual output: 1945*/
如果你真的讨厌foreach,这里有一个解决方案:
$arr=数组
公司1=>阵列
1981 => 1,
1945 => 3
,
公司2=>阵列
1990 => 18,
2005 => 13
,
公司3=>阵列
1950 => 6,
2012 => 9
;
$arr=数组\映射数组\键,$arr;
$arr=array\u reduce$arr,array\u merge,array;
您的$arr将以如下方式结束:
CREATE TABLE mytable (
mytable_id INTEGER PRIMARY KEY,
company VARCHAR(16),
year INTEGER,
value INTEGER,
-- put some more metadata...
)
SELECT min(year) AS min_year,
max(year) AS max_year
FROM mytable
Array
(
[0] => 1981
[1] => 1945
[2] => 1990
[3] => 2005
[4] => 1950
[5] => 2012
)
现在,您可以使用min和max函数,或者对其进行排序,以轻松获得最高值和最低值
sort($arr);
echo end($arr); /*highest value; actual output: 2012*/
echo reset($arr); /*lowest value; actual output: 1945*/
因为您的输入数组非常大,并且消耗大量时间,所以这正是使用一组简单的语言构造在一次过程中迭代数据集的理由
使用多个数组函数可能看起来更简洁或更聪明,但它们将对数据进行多次传递,并且总是需要比绝对必要的更多的资源
因为您的数据处理的是年份,所以您可以使用神奇的数字将业务逻辑构建到代码逻辑中——假设您永远不会遇到负年份或10000年及以后的年份
如果您想要一种更不受业务影响的方法,您可以通过将第一行从输入数组中移出并获取子数组的最小值和最大值键来为默认的最小值和最大值设定种子
幻数代码:
移动默认值代码:
请注意,移位后的代码段专门处理第一个数据集以获得默认值—这需要额外的几行—但由于elseif,因此具有更高的潜在效率
这两种技术都不使用迭代函数调用,因此实际上它们的执行速度肯定比函数技术快。因为您的输入数组非常大,并且会消耗大量时间,这正是使用一组简单的语言构造在一次传递中迭代数据集的理由
使用多个数组函数可能看起来更简洁或更聪明,但它们将对数据进行多次传递,并且总是需要比绝对必要的更多的资源
因为您的数据处理的是年份,所以您可以使用神奇的数字将业务逻辑构建到代码逻辑中——假设您永远不会遇到负年份或10000年及以后的年份
如果您想要一种更不受业务影响的方法,您可以通过sh来设定默认的最小值和最大值
从输入数组中取出第一行并获取该子数组的最小和最大键
幻数代码:
移动默认值代码:
请注意,移位后的代码段专门处理第一个数据集以获得默认值—这需要额外的几行—但由于elseif,因此具有更高的潜在效率
这两种技术都不使用迭代函数调用,因此实际上它们的执行速度肯定比函数技术快。我不想使用foreach循环处理这种任意要求有什么用?我的结果数组非常大,因此使用foreach递归和构建新数组时会消耗大量时间。然而,如果可以使用最小或最大函数来实现这一点,那将是非常有益的。-1对于禁止为此类作业制作的工具的任意限制。事实上,这个需求将这个问题带到了过于本地化和非建设性的交叉点。@cHao我认为这可以通过使用array\u键、min、max、array\u映射函数来实现。。。我只是不知道怎么。。这就是我在这里问的原因。。我已经在之前的commnet中告诉了我避免foreach的原因。@Deadlock:你的理由无效。无论采用何种方式,都必须循环整个数组和其中的每个数组,除非对子数组进行了k排序。所有这些都不需要创建新阵列。有趣的是:如果你使用array\u键或array\u映射,你无论如何都在创建一个新的数组。我不想使用foreach循环处理这个任意的需求有什么用?我的结果数组非常大,所以在使用foreach递归和构建新数组时会消耗很多时间。然而,如果可以使用最小或最大函数来实现这一点,那将是非常有益的。-1对于禁止为此类作业制作的工具的任意限制。事实上,这个需求将这个问题带到了过于本地化和非建设性的交叉点。@cHao我认为这可以通过使用array\u键、min、max、array\u映射函数来实现。。。我只是不知道怎么。。这就是我在这里问的原因。。我已经在之前的commnet中告诉了我避免foreach的原因。@Deadlock:你的理由无效。无论采用何种方式,都必须循环整个数组和其中的每个数组,除非对子数组进行了k排序。所有这些都不需要创建新阵列。有趣的是:如果你使用数组键或数组映射,你还是在创建一个新的数组。这适用于简单数组。你有两层结构。您仍然需要遍历公司,然后对于每个公司条目,您都可以使用此过程获取本地最小值和最大值。如果您的条目太多,以至于foreach速度太慢,那么您可能应该重新考虑您的方法。例如,将此列表放入数据库,并使用SQL为您完成繁重的工作这项工作适用于简单数组。你有两层结构。您仍然需要遍历公司,然后对于每个公司条目,您都可以使用此过程获取本地最小值和最大值。如果您的条目太多,以至于foreach速度太慢,那么您可能应该重新考虑您的方法。例如,将此列表放入数据库,并使用SQL为您执行繁重的操作。我在问题中已经提到我不想使用foreach循环。我在问题中已经提到我不想使用foreach循环。