我有一个数组:
Array
(
[product1] => Array
(
[id] => 1
[title] => 'p1'
[extra] => Array(
[date] => '1990-02-04 16:40:26'
)
)
[product2] => Array
(
[id] => 2
[title] => 'p2'
[extra] => Array(
[date] => '1980-01-04 16:40:26'
)
)
[product3] => Array
(
[id] => 3
[title] => 'p3'
[extra] => Array(
[date] => '2000-01-04 16:40:26'
)
)
[product4] => Array
(
[id] => 4
[title] => 'p4'
[extra] => Array(
[date] => '1995-01-04 16:40:26'
)
)
[product5] => Array
(
[id] => 5
[title] => 'p5'
[extra] => Array(
[date] => '1960-01-04 16:40:26'
)
)
...
我需要获得具有最新日期的2个产品并将它们移动到阵列的开头。
我已经查看了多重排序功能,我可以像这样对数组进行排序,但是整个数组将按日期排列,我想保持数组的顺序,但只是提升最新的2行。
我需要从数组中选出最新的2个(按日期排序),然后将它们移到数组的开头。所以id的顺序应该是:
3,4,1,2,5
最新的2已被移到数组的前面,剩下的仍按id排序。
答案 0 :(得分:1)
不是最优化的实现,但最直接的是:
$array = /* your data */;
$latest = $array;
uasort($latest, function (array $a, array $b) {
return strtotime($a['extra']['date']) - strtotime($b['extra']['date']);
});
array_splice($latest, 2);
$latestOnTop = array_merge($latest, array_diff_key($array, $latest));
array_splice
操作要求您的数组键实际上是product1
或类似的;不会使用数字索引,因为它们会被重新编号。如果是这种情况,请使用另一种截断机制。
如果您的阵列非常大,那么完整的排序将会非常缓慢。在这种情况下,您应该循环遍历数组一次,跟踪您可以找到的两个最新项目(及其键),然后跟踪array_diff_key
和array_merge
。这有点难以实现(留给读者练习),但效率更高。
答案 1 :(得分:0)
// Making array with only dates
$dates = array();
foreach ($arr as $key => $item)
$dates[$key] = $item['extra']['date'];
// Sort it by date saving keys
uasort($dates, function($i1, $i2) { return strtotime($i1) - strtotime($i2); });
// Take keys
$dates = array_keys($dates);
// Create array with two needed items
$newarray = array( $dates[0] => $arr[$dates[0]], $dates[1] => $arr[$dates[1]]);
// remove these items
unset($arr[$dates[0]]); unset($arr[$dates[1]]);
// put them in array start
$arr = array_merge($newarray, $arr);
var_dump($arr);
答案 2 :(得分:0)
// copy current array for new array
$temp = $input;
// sort temp array by latest date
uasort($temp, function($a,$b) {
return (strtotime($a['extra']['date']) < strtotime($b['extra']['date']));
});
// for 2 key value pairs to get on top
$sorted_keys = array_keys($temp);
// initialize your required array
$final = [];
// two keys to move on top
$final [ $sorted_keys[0] ] = $temp [ $sorted_keys[0] ];
$final [ $sorted_keys[1] ] = $temp [ $sorted_keys[1] ];
foreach ($input as $k => $v)
{
// insert your other array values except two latest
if(!array_key_exists($k, $final))
{
$final[$k]=$v;
}
}
unset($temp); // free up resource
$final
是您需要的数组