2012-01-27 5 views
0

PHPでライフスタイルのような種類のブログを構築しています。それは私のブログデータベース、私のつぶやきと私のLast.fmのscrobblesだけでなく、私のMySQLデータベースから取得します。配列要素を1つの点にまとめることで、ある点まで

これまでのところとても良いですが、複数の後続のscrobblesを1つにまとめたいのですが。しかし、すべてが時系列のままでなければならないので、ブログの投稿やツイートが連鎖を壊した場合、連鎖の第2部分は最初の部分と結合してはならない。

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]はツイートであるため、1つの要素にまとめてください。タイムスタンプ[published]は、結合された要素の最新のものに設定され、[contents]文字列はコンマを使用してまとめられます。しかし、[4]は組み合わせの一部ではありません。それは物事の時系列的順序を破るからです。

あなたはまだ私と一緒です:私は反復と条件などの負荷を使用することができると思いますが、パフォーマンスを考慮して処理する方法についてはわかりません。私が使用できる配列固有の関数はどれですか?出力配列に追加し、各エントリの上にループ

$last_type = ''; 
$out = array(); 

foreach ($events as $row){ 
    if ($last_type == 'scrobble' && $row['type'] == 'scrobble'){ 
     array_pop($out); 
    } 
    $out[] = $row; 
    $last_type = $row['type']; 
} 

:これは仕事をしていません

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

答えて

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関数を使用する必要があります。 Like:

foreach($posts as $v) 
{ 
    echo '<div>', $v[ 'type' ], '</div>'; 
    echo '<div>', $v[ 'published' ], '</div>'; 
    echo '<div>', join('</div><div>', $v[ 'contents' ]), '</div>'; 
} 
+0

これは、アーティストが1つのエントリに複数回出現するのを防ぐために、array_unique()を簡単に行うことができるようになりました。ありがとう! –

0

は、私は古典的なswitch文を試してみました。前のエントリがscrobbleでもあったscrobbleに出会ったら、前のエントリを出力リストから削除します。

0

+0

これは実際にトリックを行いました。どうもありがとう! –