基于不同的键对两个关联数组进行排序

时间:2014-06-29 14:28:34

标签: php arrays sorting data-structures

我有以下两个关联数组:

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

我想基于timestampcreated_at键对这两个数组进行排序,即较大的整数是第一个和较小的第二个,依此类推。这可能是使用PHP的内置函数吗?如果没有,我该如何处理这个问题呢?

修改 所需的结果是:此处,$arr1的时间戳较少,$arr2的时间戳(即created_at)较大。所以,我想得到$arr1$arr2的组合,其中$arr2是第一个,$arr1是第二个。类似的东西:

$sorted_arr = array($arr2, $arr1);

2 个答案:

答案 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);

即使键不同,它也会对数组进行排序。