2015-06-05 2 views
4

У меня есть массив:Переместить конкретные элементы массива в начало массива, не изменяя порядок остальных

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 последних (упорядочить по дате) из массива, а затем переместить их в начало массива. Таким образом, порядок идентификаторов должен быть:

3,4,1,2,5 

Последние 2 были перемещены в передней части массива, а остальные по-прежнему отсортированы по идентификатору.

+0

Можете ли вы опубликовать ожидаемый результат –

+0

use array_shift() –

+0

Не могли бы вы предоставить дополнительную информацию о том, чего вы пытаетесь достичь? –

ответ

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 Ваш требуется массив

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. Это немного сложнее реализовать (оставлено как упражнение для читателя), но гораздо эффективнее.

Смежные вопросы