2014-06-29 48 views
0

我有以下两个关联数组:排序基于不同密钥两种缔阵列

$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的内置函数吗?如果不是,我该如何处理这个问题?

EDIT 期望的结果是:这里,$arr1的时间戳是以下,$arr2的时间戳(即created_at)越大。所以,我想要得到$arr1$arr2的组合,其中$arr2是第一个,而$arr1是第二个。喜欢的东西:

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

数组中只有一个时间戳,你在排序什么? – Barmar

+0

这两个数组实际上是二维数组的元素,并且您想对它进行排序吗? – Barmar

+0

@Barmar,实际上有两个时间戳,一个是'timestamp',另一个'created_at'。我想根据这两个值对两个数组进行排序。 – abhisek

回答

0

结合RR-的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); 

它排序连阵列时使用不同的密钥。

+1

你总是可以使用'$ t1 = isset($ a ['timestamp'])? $ a ['timestamp']:$ a ['created_at']; $ t2 = isset($ b ['timestamp'])? $ b ['timestamp']:$ b ['created_at'];返回$ t2 - $ t1;'或者更好的做一个单独的函数'function extractTimestamp($ array)',你可以在其中处理各种输入。 (也许使其匿名并将其存储在变量中以避免污染全局函数名称空间。) –

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]; 

但很显然,你是后,如果帖子进行排序的方式,他们'在数组长度不明。在这种情况下,您应该使用内置的PHP函数uasort,该函数允许按照用户定义的函数进行排序,并在关联数组中维护索引(与简单的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

+0

问题是,对于第一个数组'created_at'键不存在。我需要在比较函数中使用array_key_exists吗? – abhisek

+0

是或者更好,你可以确保你的数组总是包含相同的密钥。 –

+0

谢谢!我无法确定密钥是否相同,因为数据是从第三方网站获取的。 – abhisek