その場で多次元配列をどのように構築しますか?
私はこれが自由回答式の質問であることを知っていますが、私はそれにかなりの時間を費やしています。
私が持っているのは、配列に別の子を追加する必要がある配列の一部の可能性です。
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;
}
}
}