2014-10-20 67 views
0

我正在嘗試創建一種方法從先前的數組創建多維數組,然後按日期順序對其進行排序。以日期順序動態創建多維數組

目前我的數組是這樣的:

array(5) { 

[0]=> string(161) "2013-09-18~Ready For Retina HD: Create Pixel-Perfect Assets For Multiple Scale Factors~ready-for-retina-hd-create-pixel-perfect-assets-for-multiple-scale-factors" 
[1]=> string(93) " 2010-10-20~Taking A Closer Look At Tech Conferences~taking-a-closer-look-at-tech-conferences" 
[2]=> string(71) " 2014-10-19~Wayfinding For The Mobile Web~wayfinding-for-the-mobile-web" [3]=> string(60) " 2014-05-15~Freebie: Icons Of Autumn~freebie-icons-of-autumn" 
[4]=> string(1) " " 

} 

每個數組元素現在需要用分隔符~被進一步細分,我已經使用foreach循環以前做這個但是這創造了3個不同的陣列數據,而不是一個多維數組。

我明顯需要命名每個值$date,$title$filename

你會如何做到這一點與foreach循環,以便它將其存儲在一個多維數組?這是我以前的東西

foreach ($masterpostlist as &$post){ 
    $post = explode('~',$post); 
} 

然後,你會如何排序數組的日期部分,以便他們先訂購最新的?

+1

你爲什麼不使用多維ARR ays將您的結果存儲在第一位? – Robin 2014-10-20 11:48:53

回答

1

有許多方法可以做到這一點,但我想在最短的(在代碼方面來寫)我能想到的是使用array_mapusort
首先,讓我們建立什麼,我們需要做的:

  • 消毒數據:你有你的陣列中的一個空字符串(' '),我們需要擺脫的那個和你的一些字符串包含前導空格,因此我們必須擺脫這件事情
  • 然後,每個數據塊分配給相應的鍵
  • 比較所有的日期和排序相應

第一件事首先,讓我們來消毒數據:

//assume $a is your array: 
$a = array_filter(//gets rid of empty keys 
    array_map('trim', $a)//trim each element in $a 
); 

接下來,讓我們創建一個二維數組,其中每個指數包含的鑰匙日期,標題和文件名的assoc命令數組:

$x = array_map(
    function($value) 
    { 
     return array_combine(
      ['date', 'title', 'filename'],//the keys 
      explode('~', $value)//the values 
     ); 
    }, $a); 

然後最後,讓我們梳理了很多:

usort($x, function($a, $b) 
{ 
    $dateA = new DateTime($a['date']);//create a DateTime object from value 
    $dateB = new DateTime($b['date']); 
    if ($dateA == $dateB)//if both dates are the same 
     return 0;//don't move 
    return $dateA < $dateB ? 1 : -1;//descending order 
}); 

live demo here

0

拿這個例子來看看:

$arr = array("2013-09-18~Ready For Retina HD: Create Pixel-Perfect Assets For Multiple Scale Factors~ready-for-retina-hd-create-pixel-perfect-assets-for-multiple-scale-factors", "2013-09-20~Ready For Retina HD: Create Pixel-Perfect Assets For Multiple Scale Factors~ready-for-retina-hd-create-pixel-perfect-assets-for-multiple-scale-factors", "2013-09-15~Ready For Retina HD: Create Pixel-Perfect Assets For Multiple Scale Factors~ready-for-retina-hd-create-pixel-perfect-assets-for-multiple-scale-factors"); 
$new = array(); 
foreach($arr as $v) { 
    $ex = explode("~", $v); 
    $new[] = array('date'=>$ex[0], 'title'=>$ex[1], 'detail'=>$ex[2]); 
} 

print_r($new); 

// Newest Date First 
function sortByOrder($a, $b) { 
    return strtotime($b['date']) - strtotime($a['date']); 
} 
usort($new, 'sortByOrder'); 

print_r($new); 

希望這是你想要的; DEMO

+0

在您的演示中,爲什麼當它們全部重複時,它會輸出三次數組? – Francesca 2014-10-20 12:02:02

+0

@Francesca我只複製了[[0] =>字符串(161)'值並粘貼了三次不同日期(因爲您想按日期對值進行排序),因此;) – 2014-10-20 12:04:22