2016-10-10 117 views
4

我需要从getNotifications功能由值“起始日期” DESC顺序通知数组进行排序:排序PHP数组

$posts_id_arr = getPoststIds($conn); 

foreach ($posts_id_arr as $key => $val) { 
    $total_arr[$key] = [ 
    'notification' => getNotifications($val['post_id'], $user_id, $conn) 
    ]; 
} 

$response_array = array('data' => $total_arr, 'more things' => $more_array); 
echo json_encode($response_array); 

现在的顺序是按帖子的ID,由于foreach循环。

data { 
     notification: 
     [ 
     { 
     post_id: “1", 
     start_date: "2016-10-10 08:00:00", 
     }, 
     { 
     post_id: “1", 
     start_date: "2016-10-10 12:00:00", 
     } 
    ], 
    notification: 
     [ 
     post_id: “2", 
     start_date: "2016-10-10 09:00:00", 
     }, 
     { 
     post_id: “2", 
     start_date: "2016-10-10 13:00:00", 
     } 
    ] 
} 

,我需要它是1:08:00,2:09:00,1:12:00,2:13:00

+0

我认为你应该在循环后对数据进行排序,这会有所帮助,并且需要更少的迭代。 –

+0

可能的重复[PHP排序数组的子数组值](http://stackoverflow.com/questions/2477496/php-sort-array-by-subarray-value) – Epodax

+0

@吉拉德阿达尔。你有没有尝试过我的解决方案。如果不尝试和分享想法,如果你遇到任何障碍,让我知道,以便我们纠正它。 –

回答

0

如果你想与内部数组排序你可以更好地选择usort()方法。

usort - 按使用一个用户定义的比较函数

该函数将排序通过使用用户提供的比较函数其值的数组值的数组。如果你想排序的数组需要按照一些非平凡的标准进行排序,你应该使用这个函数。

<?php 
function cmp($a, $b) 
{ 
    return strcmp($a["fruit"], $b["fruit"]); 
} 

$fruits[0]["fruit"] = "lemons"; 
$fruits[1]["fruit"] = "apples"; 
$fruits[2]["fruit"] = "grapes"; 

usort($fruits, "cmp"); 

while (list($key, $value) = each($fruits)) { 
    echo "\$fruits[$key]: " . $value["fruit"] . "\n"; 
} 
?> 

排序时的多维阵列,$a$b包含到所述阵列的第一索引的引用。

上面的例子将输出:

$fruits[0]: apples 
$fruits[1]: grapes 
$fruits[2]: lemons 

替代解决方案:

你可以尝试array_multisort(),因为它会根据你所需要的顺序排序的数组。

$arr = your array; 
$sort = array(); 
foreach($arr as $k=>$v) { 
    $sort['field'][$k] = $v['field']; 
} 

array_multisort($sort['field'], SORT_DESC, $arr); 

echo "<pre>"; 
print_r($arr); 
+0

“fruits”(posts_id_arr)不是问题,我需要对total_arr排序 –

+0

我认为他需要对整个数组进行排序,并且这只能在for循环之后适用。 –

+0

如果他正在尝试排序整个阵列。他可以使用'ksort'右键进行排序。但是,如果他试图单独对内部数组进行排序,他可以执行'array_multisort()'但建议获取输出,然后按照他想要的顺序进行排序。 –

0

但是,您不需要执行foreach内部的排序。

您可以尝试下面的代码。相应地更改变量名称。

foreach ($points as $key => $val) { 
    $time[$key] = $val[0]; 
} 

array_multisort($time, SORT_ASC, $points); 

这是因为array_multisort的工作方式。它对多个数组进行排序,并且对$time数组进行排序时,$ points数组根据$ time中的数组索引重新排序。 array_multisort应该在foreach之后,尽管
希望这会有所帮助。

+0

@gilad:你试过multi_sort? –

+0

是的,抱歉,但排序不好.. –

+0

我认为多排序将工作,你检查? –

0

您可以使用自定义函数使用uasort对数组中的值进行排序。您的日期格式可以使用strcmp进行排序 - 过去的日期比未来的日期要低,因此您可以在比较器中使用此日期。

function sort_by_date($a, $b) { 
    return strcmp($a->start_date, $b->start_date); 
} 

$sorted_posts = uasort($total_arr->notification, 'sort_by_date'); 

$response_array = array('data' => $sorted_posts, 'more things' => $more_array); 
0

您可以按照下列步骤操作:

1)定义一个临时数组来存储日期:使用arsort()

foreach ($total_arr['notification'] as $vals) { 
    $temp_dates[] = $vals['start_date']; 
} 

2)排序新创建的临时数组:

arsort($temp_dates); 

3)使用array_filter()并循环查找相应的帖子ID并存储到r esulting阵列:

$i = 0; 
foreach ($total_arr['notification'] as $vals) { 
    $res['notification'][] = array_filter($vals, function($val) { 
     return $val['start_date'] == $temp_dates[$i]; 
    }); 
    $i++; 
} 

$response_array = array('data' => $res, 'more things' => $more_array); 

注:不知道是否有重复start_date作品。

+0

由于某种原因无效。 –

+0

'total_arr'是否将'notification'直接作为关键字?还是在'notification'之前有上层索引? –