按日期顺序动态创建多维数组


Dynamically create a multidimensional array in date order

我正试图找到一种方法,从以前的数组创建一个多维数组,然后按日期顺序排序。

目前我的阵列是这样的:

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

然后,您将如何对数组的日期部分进行排序,以便它们首先排序最新的?

有很多方法可以做到这一点,但我认为我能想到的最短的方法(就编写代码而言)是使用array_mapusort
首先,让我们确定我们必须做的事情:

  • Sanitize数据:您的数组中有一个空字符串(' '),我们需要去掉它,并且您的一些字符串包含前导空格,所以我们也必须去掉它
  • 然后,将每个数据块分配给相应的密钥
  • 比较所有日期并进行相应排序

首先,让我们净化数据:

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

接下来,让我们创建一个2D数组,其中每个索引都包含一个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
});

此处的实时演示

看看这个例子:

$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