首页 > 解决方案 > PHP 在递归函数中追加数组 [0] 以获取未知深度

问题描述

我有已转换为数组的 xml。响应数组似乎没有为一个结果创建数组 [0],而是为许多结果创建数组 [0]、[1]、[2]。所以我想为每个结果响应创建 array[0] 以便标准化我的迭代。初始响应数组如下:

数组 - 一个细节

(
   [BookedDetail] => Array
        (
            [BookedDetailID] => 192            
            [Customer] => Array
                (
                    [CustomerID] => 110
                    [LanguageID] => 2                    
                    [Address] => Array
                        (
                            [StreetName] => Northway 23
                            [PostalCode] => 29843
                            [Region] => NSW
                        )
                )
            [Currency] => Array
                (
                    [CurrencyID] => 19
                    [CurrencyName] => Yen
                    [CurrencyShortName] => JPY 
                )
            [Status] => 1
            [CreateBy] => 15
        )
)

数组 - 许多细节

(
    [BookedDetail] => Array
        (
            [0] => Array
            (
                [BookedDetailID] => 192            
                [Customer] => Array
                    (
                        [CustomerID] => 110
                        [LanguageID] => 2
                        [CustomerType] => 1
                        [Address] => Array
                            (
                                [StreetName] => Northway 23
                                [PostalCode] => 29843
                                [Region] => NSW
                            )
                    )
                [Currency] => Array
                    (
                        [CurrencyID] => 19
                        [CurrencyName] => Yen
                        [CurrencyShortName] => JPY 
                    )
                [Status] => 3
                [CreateBy] => 16
            )
            [1] => Array
            (
                [BookedDetailID] => 193            
                [Customer] => Array
                    (
                        [CustomerID] => 113
                        [LanguageID] => 2
                        [CustomerType] => 1
                        [Address] => Array
                            (
                                [StreetName] => Southway 23
                                [PostalCode] => 2852
                                [Region] => SSW
                            )
                    )
                [Currency] => Array
                    (
                        [CurrencyID] => 23
                        [CurrencyName] => US Dollar
                        [CurrencyShortName] => USD
                    )
                [Status] => 2
                [CreateBy] => 17
            )
        )
)

我的预期结果:

(
    [BookedDetail] => Array
        (
            [0] => Array
            (
                [BookedDetailID] => 192            
                [Customer] => Array
                    (
                        [0] => Array
                        (
                            [CustomerID] => 110
                            [LanguageID] => 2
                            [CustomerType] => 1
                            [Address] => Array
                                (
                                    [0] => Array
                                    (
                                        [StreetName] => Northway 23
                                        [PostalCode] => 29843
                                        [Region] => NSW
                                    )
                                )
                        )
                    )
                [Currency] => Array
                    (
                        [0] = Array
                        (
                            [CurrencyID] => 19
                            [CurrencyName] => Yen
                            [CurrencyShortName] => JPY 
                        )
                    )
                [Status] => 3
                [CreateBy] => 16
            )
            [1] => Array
            (
                [BookedDetailID] => 193            
                [Customer] => Array
                    (
                        [0] => Array
                        (
                            [CustomerID] => 113
                            [LanguageID] => 2
                            [CustomerType] => 1
                            [Address] => Array
                                (
                                    [0] => Array
                                    (
                                        [StreetName] => Southway 23
                                        [PostalCode] => 2852
                                        [Region] => SSW
                                    )
                                )
                        )
                    )
                [Currency] => Array
                    (
                        [0] => Array
                        (
                            [CurrencyID] => 23
                            [CurrencyName] => US Dollar
                            [CurrencyShortName] => USD
                        )
                    )
                [Status] => 2
                [CreateBy] => 17
            )
        )
)

每个节点可以有一个或多个子节点,所以我想为每个节点制作 [0],为多个子节点制作 [0][1][2]etc。我尝试了一些代码并且在维护当前数组结果以添加递归函数时遇到问题。我是否需要函数外部变量来存储我当前的数组,或者在调用递归函数时附加它。我当前的代码:

$x1 = json_decode(json_encode($xmlobj), true);
$result = array();
function callarr ($arrin)
{            
    foreach ($arrin as $arrkey => $arrvalue)
    {
        foreach ($arrvalue as $subkey => $subvalue)
        {
            if (is_array($subvalue))
            {                               
                $arr1[$arrkey][$subkey] = $subvalue;               
                // recursive function here
            }
            else
            {
                $arr2[$arrkey][0][$subkey] = $subvalue;
            }
        }
        $result = array_merge($arr1, $arr2);                
    }
    return $result;   
}
$x2 = callarr ($x1);
print_r ($x2);

$x2 的结果将仅在 [BookedDetail] 下创建 [0] 节点,因为我还没有调用递归函数。我需要帮助才能获得预期的数组结果。非常感谢你的帮助。

标签: phpjsonxmlmultidimensional-arraydepth

解决方案


你可以尝试这样的事情,但我怀疑 array_merge 在这种情况下是否有效。您需要创建数组以向其添加多个值。在这一行中,您需要一个数组 $arr1[$arrkey][$subkey][] 来保存多个值

$x1 = json_decode(json_encode($xmlobj), true);
$result = array();
function callarr ($arrin)
{            
foreach ($arrin as $arrkey => $arrvalue)
{
    foreach ($arrvalue as $subkey => $subvalue)
    {
        if (is_array($subvalue))
        {                               
            $arr1[$arrkey][$subkey][] = $subvalue;               
            // recursive function here
        }
        else
        {
            $arr2[$arrkey][0][$subkey][] = $subvalue;
        }
    }
    $result = array_merge($arr1, $arr2);                
}
return $result;   
}
$x2 = callarr ($x1);
print_r ($x2);

推荐阅读