【问题标题】:Dynamically create a multidimensional array in date order按日期顺序动态创建多维数组
【发布时间】:2014-10-20 11:41:17
【问题描述】:

我正在尝试从以前的数组中创建一个多维数组,然后按日期顺序对其进行排序。

目前我的数组如下所示:

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

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

【问题讨论】:

  • 为什么不首先使用多维数组来存储结果?

标签: php arrays sorting multidimensional-array


【解决方案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
);

接下来,让我们创建一个二维数组,其中每个索引都包含一个关联数组,其中包含键日期、标题和文件名

$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

【讨论】:

    【解决方案2】:

    看看这个例子:

    $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

    【讨论】:

    • 在你的demo中,为什么都是重复的数组输出3次?
    • @Francesca 我只复制了[0]=&gt; string(161) 值并粘贴了三次不同的日期(因为你想按日期对值进行排序)为什么;)
    猜你喜欢
    • 1970-01-01
    • 2012-08-13
    • 1970-01-01
    • 1970-01-01
    • 2018-03-07
    • 2022-01-02
    • 1970-01-01
    • 1970-01-01
    • 2014-08-14
    相关资源
    最近更新 更多