2012-04-24 24 views
2

私は多くの検索をしましたが、良い解決策を見つけることはできません。PHP多次元配列重複除外(キー別)

私はこのような動的に生成された配列があります。このような出力を作成するために、(配列が寸法的に大きくても小さくてもよい)

Array (
    [0] => Array ([0] => a) 
    [1] => Array ([a] => Array ([0] => aa)) 
    [2] => Array ([a] => Array ([aa] => Array ([0] => aaa))) 
    [3] => Array ([a] => Array ([aa] => Array ([0] => aab))) 
    [4] => Array ([a] => Array ([ab] => Array ([0] => aba))) 
    [5] => Array ([0] => b) 
    [6] => Array ([b] => Array ([0] => bb))) 

私が何をしたいのかは、各レベルですべての重複する値を削除しています:

Array (
    [0] => Array ([a] => Array ([aa] => Array ([0] => aaa 
                [1] => aab) 
            [ab] => Array ([0] => aba) 
           ) 
       ) 
    [1] => Array ([b] => Array ([0] => bb) 
       ) 
    ) 

私はそれに対処するために、いくつかの再帰関数(以下の例)を作成しようとしましたが、まだ所望の効果を取得する方法を見つけ出すことができなかった、そして障害によりそれらのすべてを削除しました。

function deduplicateArray(&$varTemp) } 
    if (is_array($varTemp)) { 
    foreach($varTemp as $key => &$value) { 
    if (is_array($value)) { 
     // do stuff. 
     deduplicateArray($value); 
     } else { 
     // do stuff. 
     } 
    } 
    } else { 
    // do stuff. 
    } 
} 

正しい方向にちょうどいい点があっても、感謝します。

編集:

アレイは区切り文字として%2Fを使用して適切な名前のファイルから作成され、このコードによって生成されます。

function generateStructure(&$arrStructure, $strContent, $strBaseURL, $strPageURL) {  // Generate Content Structure Code. 
    if ($arrStructure === array(NULL)) { 
    $arrStructure = array('');       // Define Final Array. 
    if ($dirTemp = opendir($strContent)) { 
     while (false !== ($strFile = readdir($dirTemp))) { 
     if ($strFile != '.' && $strFile != '..') { 
      if (is_file($strContent.$strFile) && substr_count($strFile, '.php') > 0) { // Make sure is file and is php. 
      if (isset($arrFiles)) { 
       array_push($arrFiles, strtok($strFile, '.php')); 
      } else { 
       $arrFiles = array(strtok($strFile, '.php')); 
      } 
      } 
     } 
     } 
     closedir($dirTemp); 
    } else { 
     errorCode(403); 
    } 
    sort($arrFiles); // Put in Alphabetical Order 
    $intTemp = 0; 
    for ($i = 0; $i < count($arrFiles); $i++) { 
     $arrTempSplit = explode('%2F',$arrFiles[$i]);  // Create an Array of Strings from FileName String by Delimiter. 

     $ii = count($arrTempSplit) - 1;      // Create integer that is equal to the potential Multi-Dimensional Array's Columns. 
     //if ($ii > $intTemp) { 
     // $intTemp = $ii;         // Get highest elementt for The Final Array. 
     //} 

     $arrTemp=array($arrTempSplit[$ii]);     // Turn current Element into Array. 
     $ii--; 

     for($ii; $ii >= 0 ; $ii--) {       // Loop through the Multi-Dimentional Array from Right to Left. 
     $arrTemp2 = array($arrTempSplit[$ii] => $arrTemp); 
     unset($arrTemp); 
     $arrTemp = &$arrTemp2; 
     } 

     // Deduplicate Multi-Dimensional Array. 
     //if ($i > 0 && is_array($arrStructure[$i])) { 
     // $arrStructure[$i] = array_merge_recursive($arrTemp, $arrStructure[$i-1]); 
     //} else { 
     $arrStructure[$i] = $arrTemp; 
     //} 
    } 
    //$arrStructure = array_unique($arrStructure); 
    deduplicateArray($arrStructure); 
    print_r($arrStructure); 
    } 
} 

等[2]、[0] [1]として存在しないように一番上のアレイのためのそのOKとだけ直接次のレベルです。

また

に%2Faa のaa%2FA BB%の2FB私は単に彼らが注文した B%2Faa%2FA

に生成されるファイル名にテーブルをこのシナリオを持つことが可能です彼らは今すぐデバッグするのをより簡単にするために順番に並んでいます。

アーウィン・haasnoot

@意図した動作では、それを考えるために

Array ( 
     [0] => Array ([a] => Array ([aa] => Array ([0] => aab) 
             [ab] => Array ([0] => aba) 
            ) 
         [b] => Array ([0] => abb) 
        ) 
     [1] => Array ([b] => Array ([0] => bba)) 
    ) 

方法だろう一番左の値は、文字列を左から右へでている親と子です。

別の名前と同じ名前の親が存在せず、その世代の親に名前を共有する子がない可能性があります。

子供は、親と同じ名前でも、他の親に属する他の子供でもよい。

すべての親が子供を抱えているわけではありません。

すべての子供が次世代の親であるとは限りません。

親子の世代数に制限はありません。

+0

あなたはトップレベルのアレイ上array_uniqueを実行すると何が起こる:http://php.net/manual/en/function.array-unique.php –

+0

されていますブランチ間でキーが繰り返される危険性がありますか?たとえば、$ array [6] ['b'] ['aa'] 'キーが存在する可能性がありますか? – DaveRandom

+0

@MatthewRiches Array([0] => Array([0] => a)) –

答えて

0

私はまだ返信を許可されていないので、私は答えでそれをしなければならないでしょう。

あなたの問題は非常によく定義されているとは思えません。たとえば、この場合に予想される動作は何でしょうか?

Array ( 
[0] => Array ([a] => Array ([0] => aa)) 
[1] => Array ([a] => Array ([aa] => Array ([0] => aaa))) 
[2] => Array ([a] => Array ([aa] => Array ([0] => aab))) 
[3] => Array ([a] => Array ([ab] => Array ([0] => aba))) 
[4] => Array ([0] => a) 
[5] => Array ([0] => b) 
[6] => Array ([b] => Array ([0] => bb))) 

数値「キー」を行います(あるbasicly指数、またはすることができます)投げ出さます:(値は「」の代わりにキーのある配列を見てください)?それとも、キーは=「」

は、このような配列のために意図した動作とは何ですか配列上書きしない:

Array ( 
[0] => Array ([a] => Array ([aa] => Array ([0] => aab))) 
[1] => Array ([a] => Array ([ab] => Array ([0] => aba))) 
       [b] => Array ([0] => abb) 
[2] => Array ([b] => Array ([0] => bba)) 
) 

をそして私は私がカバーされていない他の多くの例を考えることができると確信していあなた自身の例でこれらのことを考えることができれば、実際の解決策に一歩近づくと思います。

+0

私はこのシナリオを表示するための質問を更新し、うまくいけばすべての可能性をカバーしています。 –

0

この機能は役に立ちます。私はまだ正確に作業しています。

EDIT:SOURCE:http://sebastiano.ezion.cc/2008/03/13/php-foreach-function-for-multi-level-arrays/#

$buff = ""; 
function foreach_loop($array) { 
global $buff; 

    foreach ($array as $key => $value) { 
     if (!is_array($value)) { // if it isn't an array show $key and $value 
       $buff .= ' ' . $key; 
       $buff .= ' -> ' . $value . '<br> '; 
     }else { // if it is an array -> show $key -> then process $value again will same function. 
       $buff .= '<strong>' . $key.'</strong> '; 
       foreach_loop($value); 
     } 
    } 
} 

foreach_loop($oldarray); 
echo $buff;