予想される出力予想される入力最も内側のオブジェクトにキーと値のペアが含まれるオブジェクトの配列から、ネストされた依存オブジェクトを作成する必要があります。最初にオブジェクト値とキー値を 2 次元配列に格納し、次にこの 2 次元配列 (トリミングされた配列) を使用して、同一の親インデックス値を持つ 2 つの行をマージする配列操作によってそれを行いました。
function recursiveMerge($rowIdx,$columnIdx,$trimmedArray,$parentArray){
/*base condition - when no column left to traverse recursively*/
if($columnIdx<1){
return($trimmedArray);
} elseif($rowIdx+1 == count($trimmedArray)){
/*
when all the rows are merged for a dropdown column, it calls the
function for the parent dropdown column
*/
$trimmedArray=array_values($trimmedArray);
$parentArray=array_values($parentArray);
//the unique dropdown values are nested inside its parent column
$trimmedArray[$rowIdx][$columnIdx-1]=array($trimmedArray[$rowIdx][$columnIdx-1]=>$trimmedArray[$rowIdx][$columnIdx]);
return(recursiveMerge(0,--$columnIdx,$trimmedArray,$parentArray));
} else {
/*
the rows which have identical parent dependent keys are merged together into
the first row and the second row is deleted(unset)
*/
if($parentArray[$rowIdx][$columnIdx]===$parentArray[$rowIdx+1][$columnIdx]){
// $trimmedArray[$rowIdx][$columnIdx]=$trimmedArray[$rowIdx][$columnIdx] + $trimmedArray[$rowIdx+1][$columnIdx];
$trimmedArray[$rowIdx][$columnIdx]=array_merge_custom($trimmedArray[$rowIdx][$columnIdx], $trimmedArray[$rowIdx+1][$columnIdx]);
unset($parentArray[$rowIdx+1]);
$parentArray=array_values($parentArray);
unset($trimmedArray[$rowIdx+1]);
$trimmedArray=array_values($trimmedArray);
return(recursiveMerge($rowIdx,$columnIdx,$trimmedArray,$parentArray));
}
else{
$trimmedArray[$rowIdx][$columnIdx-1]=array($trimmedArray[$rowIdx][$columnIdx-1]=>$trimmedArray[$rowIdx][$columnIdx]);
return(recursiveMerge(++$rowIdx,$columnIdx,$trimmedArray,$parentArray));
}
}
}
ただし、より小さいサイズのオブジェクトの配列は正常に機能します。カウントが大きい入力データは致命的なエラーになります: ALlowed メモリ サイズが使い果たされました。