0

その場で多次元配列をどのように構築しますか?

私はこれが自由回答式の質問であることを知っていますが、私はそれにかなりの時間を費やしています。

私が持っているのは、配列に別の子を追加する必要がある配列の一部の可能性です。

Array(
[0] => Array
    (
        [parentID] => 0
        [component] => 23941/01  
        [decoration] =>          
        [hasChild] => T
        [proccessed] => T
        [cmp0] => Array
            (
                [parentID] => 0
                [component] => COLC01    
                [decoration] =>          
                [hasChild] => F
                [proccessed] => T
            )

        [cmp1] => Array
            (
                [parentID] => 0
                [component] => PPH   
                [decoration] =>          
                [hasChild] => F
                [proccessed] => T
            )

    )

[1] => Array
    (
        [parentID] => 1
        [component] => 23930/20SB
        [decoration] =>          
        [hasChild] => T
        [proccessed] => T
        [cmp0] => Array
            (
                [parentID] => 1
                [component] => 23930/20  
                [decoration] =>          
                [hasChild] => T
                [proccessed] => F
            )

    )

[2] => Array
    (
        [parentID] => 2
        [component] => SC070400SB
        [decoration] =>          
        [hasChild] => T
        [proccessed] => T
        [cmp0] => Array
            (
                [parentID] => 2
                [component] => SC070400  
                [decoration] =>          
                [hasChild] => F
                [proccessed] => T
            )

    ))

単純な配列プッシュで生成した外部配列 [0,1,2]。下位レベルに到達するために配列をトラバースし始めると、1 層以上の深さに到達するのに問題があります。

ここに私の主要な質問があります: キー値をチェックして、さらに深くする必要があるかどうかを確認しながら、配列に要素を動的に追加するにはどうすればよいですか? 処理されたフラグと hasChild フラグの両方が、さらに深く掘り下げることができることを示していますが、isset と array_key_exists は、新しく追加された要素では機能しないようです。実際、配列を画面に出力すると、[cmp0] のような要素さえ表示されません...

私のコードがどれだけ役立つかはわかりませんが、参照用にここに配置します。

function explodeBOM(&$BOMArray,$library,$sonar){        
    $saveKey = '';
    $childCounter = 0;
    $childKey = '';
    foreach($BOMArray as &$bomLine){  
        $childKey = 'cmp' . (string)$childCounter;
        while(array_key_exists($childKey,$bomLine)){                
            explodeBOM($bomLine[$childKey],$library,$sonar);
        }
        if($bomLine['proccessed'] == "F"){
             $saveKey = $bomLine['parentID'];
             $bomItems = getBOM($bomLine['component'],$bomLine['decoration'],$library,$sonar);
             foreach($bomItems as $newBomLine){
                 $itemMasterInfo = getItemMasterInfo($newBomLine['BMCMP#'],$newBomLine['BMCMD#'],$library,$sonar);
                 if($itemMasterInfo['ITPRTC'] != 'P' AND $itemMasterInfo['ITPRTC'] != 'C'){            
                    // add it to the array                        
                    $componetArray = array();
                    $componetArray['parentID'] = $saveKey;
                    $componetArray['component'] = $newBomLine['BMCMP#'];
                    $componetArray['decoration'] = $newBomLine['BMCMD#'];
                    $componetArray['hasChild'] = parentOrChildBOM($newBomLine['BMCMP#'],$newBomLine['BMCMD#'],$library,$sonar);
                    if ($componetArray['hasChild'] == 'F'){
                        $componetArray['proccessed'] = 'T';                        
                    }else{
                        $componetArray['proccessed'] = 'F';                    
                    }                        
                    //array_push($bomLine,$componetArray);
                    $childKey = 'cmp' . (string)$childCounter;
                    $childCounter++;
                    $bomLine[$childKey] = $componetArray;
                    $bomLine['proccessed'] = 'T';

                    reset($BOMArray);
                 }
             }
             $childCounter = 0;
         } 
     }            
}
4

0 に答える 0