我有以下两个关联数组:
$arr1 = array(
'id' => 1,
'text' => 'Some text is here',
'timestamp' => 130458750
)
$arr2 = array(
'post_id' => 12,
'content' => 'Some content is here too',
'created_at' => 1402154823
)
我想基于timestamp
和created_at
键对这两个数组进行排序,即较大的整数是第一个和较小的第二个,依此类推。这可能是使用PHP的内置函数吗?如果没有,我该如何处理这个问题呢?
修改
所需的结果是:此处,$arr1
的时间戳较少,$arr2
的时间戳(即created_at)较大。所以,我想得到$arr1
和$arr2
的组合,其中$arr2
是第一个,$arr1
是第二个。类似的东西:
$sorted_arr = array($arr2, $arr1);
答案 0 :(得分:1)
首先让我说你的一个数组包含timestamp
,第二个包含created_at
。我认为它们都应该是created_at
。
如果你想"排序"只有你在评论中说的两个条目,任务很简单:
<?php
$arr1 = array(
'id' => 1,
'text' => 'Some text is here',
'created_at' => 130458750 #corrected from "timestamp"
);
$arr2 = array(
'post_id' => 12,
'content' => 'Some content is here too',
'created_at' => 1402154823
);
$posts = $arr2['created_at'] > $arr1['created_at']
? [$arr2, $arr1]
: [$arr1, $arr2];
但显然你所追求的是一种对帖子进行排序的方法,如果他们排在未知长度的数组中。在这种情况下,您应该使用uasort
内置PHP函数,它允许按用户定义的函数进行排序,并在关联数组中维护索引(而不是普通的usort
)。示例代码如下所示:
$posts = [$arr1, $arr2];
uasort($posts, function($a, $b)
{
return $b['created_at'] - $a['created_at'];
});
var_dump($posts);
输出:
array(2) {
[1]=>
array(3) {
["post_id"]=>
int(12)
["content"]=>
string(24) "Some content is here too"
["created_at"]=>
int(1402154823)
}
[0]=>
array(3) {
["id"]=>
int(1)
["text"]=>
string(17) "Some text is here"
["created_at"]=>
int(130458750)
}
}
要获得相反的顺序,您可以在自定义排序函数中反转参数,即与$a
交换$b
。
答案 1 :(得分:0)
结合rr-'s solution,我想出了以下内容:
$arr1 = array(
'id' => 1,
'text' => 'Some text is here',
'timestamp' => 130458750
);
$arr2 = array(
'post_id' => 12,
'content' => 'Some content is here too',
'created_at' => 1402154823
);
$arr3 = array(
'post_id' => 21,
'content' => 'Some content is here too',
'created_at' => 1258475
);
$arr = [];
$arr[] = $arr1;
$arr[] = $arr2;
$arr[] = $arr3;
uasort($arr, function($a, $b)
{
$t1 = isset($a['timestamp']) ? $a['timestamp'] : $a['created_at'];
$t2 = isset($b['timestamp']) ? $b['timestamp'] : $b['created_at'];
return $t2 - $t1
});
var_dump($arr);
即使键不同,它也会对数组进行排序。