0

したがって、$twitterData と $facebookData の 2 つの配列があります。

$twitterData は次のようになります

[0] => Array
    (
        [text] => Hello World http://somelink
        [type] => twitter
    )

[1] => Array
    (
        [text] => We like to keep our developers happy! 
        [type] => twitter
    )

$facebookData は次のようになります

[0] => Array
        (
            [text] => We like to keep our developers happy! http://somelink.com
            [type] => facebook
        )

[1] => Array
        (
            [text] => Take a look
            [type] => facebook
        )

2 つの配列を $socialFeed という 1 つの配列にマージしようとしています。問題は、それらをマージしようとしているため、「テキスト」キーの最初の 50 文字が任意の 2 つの配列項目で同じである場合、マージされた配列でその項目が 1 回だけ表示されるようにすることです。したがって、「私たちは開発者を満足させたい! http://somelink.com」が 1 回表示されます (リンクのあるものとないものではなく)。

array_diff と array_intersect の両方を使用してみましたが、どちらもテキスト キーの最初の X 文字だけではなく、キーの値全体を比較します。

4

2 に答える 2

0

私は先に進み、あなたのためにクラスを作りました。基本的に、両方の配列をループして、両方の配列からのテキスト データのみを含む新しい配列を作成します。新しい配列を作成した後 (同じテキストの既存の配列データをチェック - 重複なし)、元の配列ごとにブール変数を設定し、一意のテキスト文字列の配列をループして、各配列のテキスト文字列をチェックします。元の配列のいずれかにテキストが見つかった場合、対応する元の配列のブール値を変更します。2 つのブール変数の値をテストし、それに応じて新しい $socialArr 値を設定します。これが理にかなっていることを願っています。コードはテスト済みで動作します。

<?php

class socialArray {

    public function init($twitter,$facebook){
        $this->combinedText = $this->combinedTextArr($twitter,$facebook);
        $this->socialArr = $this->makeSocialArr($twitter,$facebook);
        return $this->socialArr;
    }

    public function combinedTextArr($twitter,$facebook){
        $combinedText = array();
        foreach($twitter as $key => $value){
            if( !in_array($value["text"],$combinedText ) ){
                $combinedText[] = $value["text"];
            }
        }
        foreach($facebook as $key => $value){
            if( !in_array($value["text"],$combinedText ) ){
                $combinedText[] = $value["text"];
            }
        }
        return $combinedText;
    }

    public function makeSocialArr($twitter,$facebook){
        $socialArr = array();
        foreach($this->combinedText as $value){
            $twitterTest = false;
            $facebookTest = false;
            foreach($twitter as $var){
                if( $var["text"] == $value) {
                    $twitterTest = true;
                }
            }
            foreach($facebook as $var){
                if( $var["text"] == $value ) {
                    $facebookTest = true;
                }
            }
            if( $twitterTest === true && $facebookTest === false ) {
                $socialArr[] = array(
                                        'text' => $value,
                                        'type' => 'twitter'
                                    );
            } else if ( $twitterTest === false && $facebookTest === true ) {
                $socialArr[] = array(
                                        'text' => $value,
                                        'type' => 'facebook'
                                    );
            } else if ( $twitterTest === true && $facebookTest === true ) {
                $socialArr[] = array(
                                        'text' => $value,
                                        'type' => 'both'
                                    );
            }
        }
        return $socialArr;
    }

}


$facebook = array();

$facebook[] = array(
                    "text" => "A post on facebook with text and stuff",
                    "type" => "facebook"
                );

$facebook[] = array(
                    "text" => "This occurs in both arrays",
                    "type" => "facebook"
                );

$twitter = array();

$twitter[] = array(
                    "text" => "A tweet of the utmost importance",
                    "type" => "twitter"
                );

$twitter[] = array(
                    "text" => "This occurs in both arrays",
                    "type" => "twitter"
                );

$socArrMaker = new socialArray();
$socialArr = $socArrMaker->init($twitter,$facebook);

echo "<html><head><style type=\"text/css\">body{ font-family: sans-serif; }</style></head><body><pre>\r\n";
print_r($socialArr);
echo "</pre></body></html>\r\n";

...を生成する

Array
(
    [0] => Array
        (
            [text] => A tweet of the utmost importance
            [type] => twitter
        )

    [1] => Array
        (
            [text] => This occurs in both arrays
            [type] => both
        )

    [2] => Array
        (
            [text] => A post on facebook with text and stuff
            [type] => facebook
        )

)
于 2013-09-23T14:44:54.157 に答える
0

配列キーとして共通にしたい値を使用し、エントリが既に存在する場合はネットワークをプッシュします。

$feedResult = array();

foreach ($twitterPost AS $entry){
    $newKey = substr($entry["text"], 0 , 10); //first 10chars
    if (isset($feedResult[$newKey])){
       //actually this will never happen, because when iterating the FIRST
       //post array, there will be no entry. But doing so allows to swap arround
       //the processing order of networks.
       $feedResult[$newKey]["network"][] = "twitter"; //add another network
    }else{
       //create new entry
       $feedResult[$newKey] = array("network" => array("twitter"), "text" => $entry["text"]);
    }
}

foreach ($facebookPost AS $entry){
    $newKey = substr($entry["text"], 0 , 10); //first 10chars
    if (isset($feedResult[$newKey])){
       $feedResult[$newKey]["network"][] = "facebook"; //add another network
    }else{
       //create new entry
       $feedResult[$newKey] = array("network" => array("facebook"), "text" => $entry["text"]);
    }
}

最後に、次のようなものが得られます(テストされていませんが、アイデアは明確なはずです):

["Hello Worl"] => Array
(
  ["Text"] = "Hello World http://somelink"
  ["network"] => Array
  ( 
       [0] => "twitter" 
  )
)
["We like to"] => Array
(
  ["Text"] = "We like to keep our developers happy!"
  ["network"] => Array
  ( 
     [0] => "twitter",
     [1] => "facebook" 
  )
)
["Take a loo"] => Array
(
  ["Text"] = "Take a look"
  ["network"] => Array
  ( 
     [0] => "facebook" 
  )
)

最適化はmd5()、COMPLETE テキストのハッシュを新しいキーとして使用することです。次に、テキスト値が等しい場合、それらはマージされます-(またはハッシュが一致しますが、それは別のトピックであり、ニュース投稿では発生しない可能性が最も高いです)

于 2013-09-20T19:09:34.350 に答える