Php 对其值与数组关联的数组进行排序
我有一个数组,它的值是关联数组。我需要根据键对这个数组进行排序Php 对其值与数组关联的数组进行排序,php,Php,我有一个数组,它的值是关联数组。我需要根据键对这个数组进行排序 $list = array ( array("post_id"=>"2","date"=>"2015","title"=>"title2"), array("post_id"=>"4","date"=>"2017","title"=>"title4"), array("post_id"=>"3","date"=>"2016","title"=>"title
$list = array (
array("post_id"=>"2","date"=>"2015","title"=>"title2"),
array("post_id"=>"4","date"=>"2017","title"=>"title4"),
array("post_id"=>"3","date"=>"2016","title"=>"title3"),
array("post_id"=>"1","date"=>"2014","title"=>"title1")
);
例如,按post_id对该数组进行排序,这意味着将该数组转换为:
$list = array (
array("post_id"=>"1","date"=>"2014","title"=>"title1"),
array("post_id"=>"2","date"=>"2015","title"=>"title2"),
array("post_id"=>"3","date"=>"2016","title"=>"title3"),
array("post_id"=>"4","date"=>"2017","title"=>"title4")
);
我搜索了此论坛并找到以下代码:
function array_sort($array, $on, $order=SORT_ASC){
$new_array = array();
$sortable_array = array();
if (count($array) > 0) {
foreach ($array as $k => $v) {
if (is_array($v)) {
foreach ($v as $k2 => $v2) {
if ($k2 == $on) {
$sortable_array[$k] = $v2;
}
}
} else {
$sortable_array[$k] = $v;
}
}
switch ($order) {
case SORT_ASC:
asort($sortable_array);
break;
case SORT_DESC:
arsort($sortable_array);
break;
}
foreach ($sortable_array as $k => $v) {
$new_array[$k] = $array[$k];
}
}
return $new_array;}
但我不明白它到底在做什么。
主题链接是:
您没有按键排序,因此您找到的示例对您不适用。一个简单的
usort
就可以了
$list = array (
array("post_id"=>"2","date"=>"2015","title"=>"title2"),
array("post_id"=>"4","date"=>"2017","title"=>"title4"),
array("post_id"=>"3","date"=>"2016","title"=>"title3"),
array("post_id"=>"1","date"=>"2014","title"=>"title1")
);
function sortPosts($a, $b)
{
if ($a['post_id'] == $b['post_id']) {
return 0;
}
return ($a['post_id'] < $b['post_id']) ? -1 : 1;
}
usort($list, "sortPosts");
$list=array(
数组(“post_id”=>“2”,“date”=>“2015”,“title”=>“title2”),
数组(“post_id”=>“4”,“date”=>“2017”,“title”=>“title4”),
数组(“post_id”=>“3”,“date”=>“2016”,“title”=>“title3”),
数组(“post_id”=>“1”、“date”=>“2014”、“title”=>“title1”)
);
功能分类柱($a,$b)
{
如果($a['post\u id']=$b['post\u id'])){
返回0;
}
报税表($a['post_id']<$b['post_id'])?-1:1;
}
usort($list,“分拣口”);
这会将您的$lists
数组传递到一个函数中,并比较每个数组的值-您可以看到我们正在比较每个数组的['post_id']
值
由于post_id是原始数组中的字符串,您可能需要将它们转换为整数,但请看如何操作 您没有按键排序,因此您找到的示例不适合您。一个简单的
usort
就可以了
$list = array (
array("post_id"=>"2","date"=>"2015","title"=>"title2"),
array("post_id"=>"4","date"=>"2017","title"=>"title4"),
array("post_id"=>"3","date"=>"2016","title"=>"title3"),
array("post_id"=>"1","date"=>"2014","title"=>"title1")
);
function sortPosts($a, $b)
{
if ($a['post_id'] == $b['post_id']) {
return 0;
}
return ($a['post_id'] < $b['post_id']) ? -1 : 1;
}
usort($list, "sortPosts");
$list=array(
数组(“post_id”=>“2”,“date”=>“2015”,“title”=>“title2”),
数组(“post_id”=>“4”,“date”=>“2017”,“title”=>“title4”),
数组(“post_id”=>“3”,“date”=>“2016”,“title”=>“title3”),
数组(“post_id”=>“1”、“date”=>“2014”、“title”=>“title1”)
);
功能分类柱($a,$b)
{
如果($a['post\u id']=$b['post\u id'])){
返回0;
}
报税表($a['post_id']<$b['post_id'])?-1:1;
}
usort($list,“分拣口”);
这会将您的$lists
数组传递到一个函数中,并比较每个数组的值-您可以看到我们正在比较每个数组的['post_id']
值
由于post_id是原始数组中的字符串,您可能需要将它们转换为整数,但请看如何操作 最优雅的方法通常是将
usort()
函数与闭包结合使用
看看这个简单的演示:
<?php
$list = [
["post_id"=>"2","date"=>"2015","title"=>"title2"],
["post_id"=>"4","date"=>"2017","title"=>"title4"],
["post_id"=>"3","date"=>"2016","title"=>"title3"],
["post_id"=>"1","date"=>"2014","title"=>"title1"]
];
usort(
$list,
function($a, $b) {
return $a['post_id'] < $b['post_id'];
}
);
print_r($list); // First output, descending order
usort(
$list,
function($a, $b) {
return $a['post_id'] > $b['post_id'];
}
);
print_r($list); // Second output, ascending order
第二个输出,升序:
Array
(
[0] => Array
(
[post_id] => 4
[date] => 2017
[title] => title4
)
[1] => Array
(
[post_id] => 3
[date] => 2016
[title] => title3
)
[2] => Array
(
[post_id] => 2
[date] => 2015
[title] => title2
)
[3] => Array
(
[post_id] => 1
[date] => 2014
[title] => title1
)
)
Array
(
[0] => Array
(
[post_id] => 1
[date] => 2014
[title] => title1
)
[1] => Array
(
[post_id] => 2
[date] => 2015
[title] => title2
)
[2] => Array
(
[post_id] => 3
[date] => 2016
[title] => title3
)
[3] => Array
(
[post_id] => 4
[date] => 2017
[title] => title4
)
)
最优雅的方法通常是将usort()
函数与闭包组合使用
看看这个简单的演示:
<?php
$list = [
["post_id"=>"2","date"=>"2015","title"=>"title2"],
["post_id"=>"4","date"=>"2017","title"=>"title4"],
["post_id"=>"3","date"=>"2016","title"=>"title3"],
["post_id"=>"1","date"=>"2014","title"=>"title1"]
];
usort(
$list,
function($a, $b) {
return $a['post_id'] < $b['post_id'];
}
);
print_r($list); // First output, descending order
usort(
$list,
function($a, $b) {
return $a['post_id'] > $b['post_id'];
}
);
print_r($list); // Second output, ascending order
第二个输出,升序:
Array
(
[0] => Array
(
[post_id] => 4
[date] => 2017
[title] => title4
)
[1] => Array
(
[post_id] => 3
[date] => 2016
[title] => title3
)
[2] => Array
(
[post_id] => 2
[date] => 2015
[title] => title2
)
[3] => Array
(
[post_id] => 1
[date] => 2014
[title] => title1
)
)
Array
(
[0] => Array
(
[post_id] => 1
[date] => 2014
[title] => title1
)
[1] => Array
(
[post_id] => 2
[date] => 2015
[title] => title2
)
[2] => Array
(
[post_id] => 3
[date] => 2016
[title] => title3
)
[3] => Array
(
[post_id] => 4
[date] => 2017
[title] => title4
)
)
我使用此功能:
function aasort (&$array, $key) {
$sorter=array();
$ret=array();
reset($array);
foreach ($array as $ii => $va) {
$sorter[$ii]=$va[$key];
}
asort($sorter);
foreach ($sorter as $ii => $va) {
$ret[$ii]=$array[$ii];
}
$array=$ret;
return $array;
}
$list = array (
array("post_id"=>"2","date"=>"2015","title"=>"title2"),
array("post_id"=>"4","date"=>"2017","title"=>"title4"),
array("post_id"=>"3","date"=>"2016","title"=>"title3"),
array("post_id"=>"1","date"=>"2014","title"=>"title1")
);
$outputArray = aasort($list,"post_id");
我使用此功能:
function aasort (&$array, $key) {
$sorter=array();
$ret=array();
reset($array);
foreach ($array as $ii => $va) {
$sorter[$ii]=$va[$key];
}
asort($sorter);
foreach ($sorter as $ii => $va) {
$ret[$ii]=$array[$ii];
}
$array=$ret;
return $array;
}
$list = array (
array("post_id"=>"2","date"=>"2015","title"=>"title2"),
array("post_id"=>"4","date"=>"2017","title"=>"title4"),
array("post_id"=>"3","date"=>"2016","title"=>"title3"),
array("post_id"=>"1","date"=>"2014","title"=>"title1")
);
$outputArray = aasort($list,"post_id");
这可能不是从那个问题中选择的最佳答案。只需提取要排序的列,然后对该列进行排序即可对原始列进行排序:
array_multisort(array_column($list, 'post_id'), SORT_ASC, $list);
这可能不是从那个问题中选择的最佳答案。只需提取要排序的列,然后对该列进行排序即可对原始列进行排序:
array_multisort(array_column($list, 'post_id'), SORT_ASC, $list);
您可以使用以下代码:
<?php
$list = array (
array("post_id"=>"2","date"=>"2015","title"=>"title2"),
array("post_id"=>"4","date"=>"2017","title"=>"title4"),
array("post_id"=>"3","date"=>"2016","title"=>"title3"),
array("post_id"=>"1","date"=>"2014","title"=>"title1")
);
$sorted = array_orderby($list, 'post_id', SORT_ASC);
echo "<pre>";
print_r($sorted);
function array_orderby()
{
$args = func_get_args();
$data = array_shift($args);
foreach ($args as $n => $field) {
if (is_string($field)) {
$tmp = array();
foreach ($data as $key => $row)
$tmp[$key] = $row[$field];
$args[$n] = $tmp;
}
}
$args[] = &$data;
call_user_func_array('array_multisort', $args);
return array_pop($args);
}
?>
您可以使用以下代码:
<?php
$list = array (
array("post_id"=>"2","date"=>"2015","title"=>"title2"),
array("post_id"=>"4","date"=>"2017","title"=>"title4"),
array("post_id"=>"3","date"=>"2016","title"=>"title3"),
array("post_id"=>"1","date"=>"2014","title"=>"title1")
);
$sorted = array_orderby($list, 'post_id', SORT_ASC);
echo "<pre>";
print_r($sorted);
function array_orderby()
{
$args = func_get_args();
$data = array_shift($args);
foreach ($args as $n => $field) {
if (is_string($field)) {
$tmp = array();
foreach ($data as $key => $row)
$tmp[$key] = $row[$field];
$args[$n] = $tmp;
}
}
$args[] = &$data;
call_user_func_array('array_multisort', $args);
return array_pop($args);
}
?>
功能
问题是:
- 首先通过子数组中的
$on
收集所有值(第一个foreach
),并通过原始数组键$k
将其绑定到$sortable\u数组中。像$list[0]['post_id']代码>收集在:$sortable_数组[0]
李>
- 收集完所有值后,将使用
asort
对数组进行DESC或ASC排序(请参见switch
),以保持索引=>值连接。因此,$sortable_数组
看起来像是:在[0=>2,1=>4,2=>3,3=>1]
之后的[3=>1,0=>2,2=>3,1=>4]
- 因此,现在对值进行了排序,可以在下一步中使用索引
- 在最后一个
foreach
中,将生成一个新数组。$sortable\u数组
中的索引$k
用于以新顺序从原始\u数组中获取子数组李>
注意:此部分if(is_array($v))
使函数行为不可预测,因为它只需要$v
如果$v
不是子数组,则它将从子数组获取数据 中的函数
问题是:
- 首先通过子数组中的
$on
收集所有值(第一个foreach
),并通过原始数组键$k
将其绑定到$sortable\u数组中。像$list[0]['post_id']代码>收集在:$sortable_数组[0]
李>
- 收集完所有值后,将使用
asort
对数组进行DESC或ASC排序(请参见switch
),以保持索引=>值连接。因此,$sortable_数组
看起来像是:在[0=>2,1=>4,2=>3,3=>1]
之后的[3=>1,0=>2,2=>3,1=>4]
- 因此,现在对值进行了排序,可以在下一步中使用索引
- 在最后一个
foreach
中,将生成一个新数组。$sortable\u数组
中的索引$k
用于以新顺序从原始\u数组中获取子数组李>
注意:此部分if(is_array($v))
使函数行为不可预测,因为它只需要$v
如果$v
不是子数组,则它将从子数组获取数据 是的,谢谢。我使用它和它的工作。链接中的代码也在工作。谢谢。谢谢。我使用它和它的工作。链接中的代码也在工作。也许非常感谢?也许?