-1

予想される出力予想される入力最も内側のオブジェクトにキーと値のペアが含まれるオブジェクトの配列から、ネストされた依存オブジェクトを作成する必要があります。最初にオブジェクト値とキー値を 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 メモリ サイズが使い果たされました。

4

1 に答える 1