将数组元素组合成一个元素,直到某一点

时间:2012-01-27 20:42:35

标签: php arrays blogs

我正在用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]不能成为组合的一部分,因为这会破坏事物的时间顺序。

如果你还在我身边:我想我可以使用大量的迭代和条件等,但我不确定如何处理性能问题。我可以使用任何特定于数组的函数吗?

3 个答案:

答案 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>';
}