そこにあるネストされた配列スレッドからの重複値の削除のほとんどすべてを読んで適用しようとしましたが、この問題は、(非常に)大きな多次元配列から重複ブランチ全体を削除しようとしているという点で少し独特であると思います。これは、配列タイプの質問から重複配列を削除することだと思いますか?
Pastebinにダンプがあります。重複をカーニングするために superUnique を呼び出している保護されたメソッドを使用しようとしていますが、機能していません (以下に表示)。私は何を間違っていますか?
/**
* @param $array
* @param bool $preserveKeys
* @param array $hashes
* @return array
*/
protected function superUnique($array, $preserveKeys = false, $hashes = array())
{
$uniqueArray = array();
foreach ($array AS $key => $value)
{
if (TRUE === is_array($value))
{
$hash = md5(serialize($value));
if (FALSE === isset($hashes[$hash]))
{
$hashes[$hash] = $hash;
$uniqueArray[$key] = $this->superUnique($value, $preserveKeys, $hashes);
} else {
// skip it i guess ?? should be a duplicate
}
} else {
if ($preserveKeys)
{
$uniqueArray[$key] = $value;
} else {
$uniqueArray[] = $value;
}
}
}
return $uniqueArray;
}
実行されるコード AS と、配列の重複の例を次に示します。
$output = $this->superUnique($output, 1);
foreach ($output AS $num => $arr)
{
// turns a multidim array to an object recursively
$obj = $this->arrToObj($arr);
if (isset($obj->message->body))
{
echo "Arr#: {$num}\n";
echo "Time: {$obj->attributes->timestamp}\n";
echo "Body: {$obj->message->body}\n\n\n";
}
}
die;
これは、pastebin 配列に基づく高レベルの重複を示す出力のスライスです。
Arr#: 172
Time: 2013-06-25T16:34:46-0700
Body: ok, so we decided on everything then?
Arr#: 173
Time: 2013-06-25T16:34:46-0700
Body: ok, so we decided on everything then?
Arr#: 174
Time: 2013-06-25T16:34:46-0700
Body: ok, so we decided on everything then?
Arr#: 175
Time: 2013-06-25T16:34:46-0700
Body: ok, so we decided on everything then?
Arr#: 176
Time: 2013-06-25T16:34:59-0700
Body: yes, see you tomorrow
Arr#: 177
Time: 2013-06-25T16:34:59-0700
Body: yes, see you tomorrow
Arr#: 178
Time: 2013-06-25T16:34:59-0700
Body: yes, see you tomorrow
Arr#: 179
Time: 2013-06-25T16:34:59-0700
Body: yes, see you tomorrow
Arr#: 180
Time: 2013-06-25T16:35:38-0700
Body: are you still onlne?
Arr#: 181
Time: 2013-06-25T16:36:10-0700
Body: hey bob