我正在用PHP构建一个类似生命流的博客。它从我的MySQL数据库中获取我的博客文章,以及我的推文和我的Last.fm scrobbles。
到目前为止一直很好,但我想将多个后续的scrobbles组合成一个。但是,一切都需要按时间顺序排列,所以如果博客文章或推文打破了一连串的混乱,那么链条的第二部分就不能与第一部分结合起来。
Array
(
[0] => Array
(
[contents] => Disturbed
[type] => scrobble
[published] => 1327695674
)
[1] => Array
(
[contents] => Amon Amarth
[type] => scrobble
[published] => 1327695461
)
[2] => Array
(
[contents] => Apocalyptica
[type] => scrobble
[published] => 1327693094
)
[3] => Array
(
[contents] => This is a tweet. Really.
[type] => tweet
[published] => 1327692794
)
[4] => Array
(
[contents] => Dead by Sunrise
[type] => scrobble
[published] => 1327692578
)
)
因为[3]是推文,scrobbles [0] - [2]应该合并为一个元素。时间戳[已发布]应设置为最新的组合元素,[contents]字符串将使用逗号组合在一起。但[4]不能成为组合的一部分,因为这会破坏事物的时间顺序。
如果你还在我身边:我想我可以使用大量的迭代和条件等,但我不确定如何处理性能问题。我可以使用任何特定于数组的函数吗?
答案 0 :(得分:0)
我会尝试一个经典的switch语句:
$lastType = "";
$count = 0;
foreach($arrays as $array) {
switch($array["type"]) {
case "scrobble":
if($lastType == "scrobble")
$count++;
else {
$count = 1;
$lastType = "scrobble";
}
break;
case "tweet":
// same as above
break;
}
}
答案 1 :(得分:0)
这就是工作:
$last_type = '';
$out = array();
foreach ($events as $row){
if ($last_type == 'scrobble' && $row['type'] == 'scrobble'){
array_pop($out);
}
$out[] = $row;
$last_type = $row['type'];
}
循环每个条目,将它们添加到输出数组。当我们遇到上一个条目也是scrobble的scrobble时,从输出列表中删除前一个条目。
答案 2 :(得分:0)
$posts = array( /* data here: posts, tweets... */ );
$last_k = null;
foreach( $posts as $k => $v )
{
if( ( null !== $last_k ) && ( $posts[ $last_k ][ 'type' ] == $v[ 'type' ] ) )
{
$posts[ $last_k ][ 'contents' ][] = $v[ 'contents' ];
$posts[ $last_k ][ 'published' ] = max( $posts[ $last_k ][ 'published' ], $v[ 'published' ] );
unset( $posts[ $k ] );
continue;
}
$posts[ $k ][ 'contents' ] = (array)$v[ 'contents' ];
$last_k = $k;
}
因为'contents'索引现在是数组,所以你必须使用join函数来输出。 像:
foreach( $posts as $v )
{
echo '<div>', $v[ 'type' ], '</div>';
echo '<div>', $v[ 'published' ], '</div>';
echo '<div>', join( '</div><div>', $v[ 'contents' ] ), '</div>';
}