将特定的数组项移动到数组开头,而不改变其余项的顺序

5

我有一个数组:

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'
        )
    )
    ...

我需要获取最新日期的两个产品并将它们移动到数组的开始。我已经调查了multisort函数,可以像这样对数组进行排序,但是整个数组都会按照日期排列,我想保留数组的顺序,只是把最近的两行推上去。我需要从数组中挑选出最近的两个(按日期排序),然后将它们移动到数组的开始。因此id的顺序应该是:
3,4,1,2,5

最新的2个已经移到数组的前面,其余的仍按id排序。

你能发布期望的输出吗? - Narendrasingh Sisodia
我已经编辑了问题,说明我想要实现什么。 - panthro
3
给定的数组不可能存在(出现重复键),提供一个真实的数组样本会更有帮助。 - deceze
我已经更新了问题。 - panthro
1
替代方案:遍历数组以查找最新项的键(使用foreacharray_reduce),然后将其使用array_splicearray_merge合并回来。 - deceze
显示剩余7条评论
3个回答

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_keyarray_merge来处理这些项。这比较难实现(留作读者练习),但效率更高。


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

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 是您所需的数组


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接