我正试图找到一种方法,从以前的数组创建一个多维数组,然后按日期顺序排序。
目前我的阵列是这样的:
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_map
和usort
首先,让我们确定我们必须做的事情:
- 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