2

私は多くの検索を行いましたが、良い解決策を見つけることができません。

次のような動的に生成された配列があります。

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

最上位の配列が [0][1][2] などのように存在せず、直接次のレベルになることは問題ありません。

また、テーブルが生成されるファイル名にこのシナリオを含めることもできます

a%2Faaaa%2Fa bb%2Fb b%2Faa%2Fa

デバッグを容易にするために、現在の順序で並べただけです。

@erwin-haasnoot

意図した動作は

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

考え方としては一番左の値が左から右に文字列の親子です。

別の世代と同じ名前の親は存在しない可能性があり、その世代の親には同じ名前の子がいない可能性があります。

ただし、子は親と同じ名前である場合や、他の親に属する他の子と同じ場合があります。

すべての親が子供を持つわけではありません。

すべての子供が次世代の親になるわけではありません。

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

4

2 に答える 2

0

この関数は役に立ちます、私はまだどれだけ正確に取り組んでいます。

編集:ソース: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; 
于 2012-04-24T14:43:25.333 に答える
0

私はまだ返信を許可されていないので、返信で行う必要があります。

あなたの問題はあまり明確に定義されていないと思います。たとえば、この場合、予想される動作は何でしょうか? (値がキーではなく「a」である配列を見てください):

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 ) ) )

数値の「キー」(基本的にどのインデックスであるか、または可能であるか) は破棄されますか? または、key = 'a' の配列を上書きしますか?

このような配列の意図された動作は何ですか:

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 ) ) 
)

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

于 2012-04-24T14:16:59.143 に答える