未知深度递归函数中的PHP追加数组[0]

未知深度递归函数中的PHP追加数组[0],php,json,xml,multidimensional-array,depth,Php,Json,Xml,Multidimensional Array,Depth,我有已经转换成数组的xml。响应数组似乎没有为一个结果创建数组[0],而是为多个结果创建数组[0]、[1]、[2]。所以我想为每个结果响应创建数组[0],以便为我的迭代进行标准化。初始响应数组如下所示: 阵列-一个细节 ( [BookedDetail] => Array ( [BookedDetailID] => 192 [Customer] => Array

我有已经转换成数组的xml。响应数组似乎没有为一个结果创建数组[0],而是为多个结果创建数组[0]、[1]、[2]。所以我想为每个结果响应创建数组[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]等。我尝试了一些代码,但在维护当前数组结果以添加递归函数时遇到了问题。我需要函数外部的变量来存储当前数组,还是在调用递归函数时追加它。我当前的代码:

$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]节点,因为我还没有调用递归函数。我需要帮助才能获得预期的数组结果。非常感谢您的帮助。

您可以尝试类似的方法,但我怀疑array\u 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);

您可以尝试类似的方法,但我怀疑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);

很难知道这是否正是你想要的,但你可能比我更容易检查

该函数现在是递归的,您可以通过再次调用该函数来查看注释被删除的位置和赋值被替换的位置,方法是使用
$arrvalue

function callarr ($arrin)
{
    $result = array();
    foreach ($arrin as $arrkey => $arrvalue)
    {
        if (is_array($arrvalue))
        {
            $result[$arrkey][] = callarr($arrvalue);
        }
        else
        {
            $result[$arrkey] = $arrvalue;
        }
    }
    return $result;
}

很难知道这是否正是你想要的,但你可能比我更容易检查

该函数现在是递归的,您可以通过再次调用该函数来查看注释被删除的位置和赋值被替换的位置,方法是使用
$arrvalue

function callarr ($arrin)
{
    $result = array();
    foreach ($arrin as $arrkey => $arrvalue)
    {
        if (is_array($arrvalue))
        {
            $result[$arrkey][] = callarr($arrvalue);
        }
        else
        {
            $result[$arrkey] = $arrvalue;
        }
    }
    return $result;
}

有一个要转换的示例XML文件会有帮助。嗨,奈杰尔,谢谢你的回复。对不起,我是新手。我尝试在代码$x1=json_decode(json_encode($xmlobj),true)之后复制数组;在这个链接中:对于每个节点,它可以是一个没有[0]的结果,也可以是两个或三个没有[0][1][2]的结果,所以如果我不进行标准化,我必须检查每个节点是否是数组或对象,我不知道数组的深度。嗨-使用XML源会更容易。嗨,Nigel,我将xml复制粘贴到这个link:sample中,其中包含一个和多个items响应。谢谢你的帮助。如果有一个要转换的示例XML文件会有所帮助。嗨,奈杰尔,谢谢你的回复。对不起,我是新手。我尝试在代码$x1=json_decode(json_encode($xmlobj),true)之后复制数组;在这个链接中:对于每个节点,它可以是一个没有[0]的结果,也可以是两个或三个没有[0][1][2]的结果,所以如果我不进行标准化,我必须检查每个节点是否是数组或对象,我不知道数组的深度。嗨-使用XML源会更容易。嗨,Nigel,我将xml复制粘贴到这个link:sample中,其中包含一个和多个items响应。谢谢你的帮助。嗨,阿米特·夏玛,非常感谢你的回复。对不起,我是新手,所以我会花更长的时间来组合你的答案。$arr1[$arrkey][$subkey][]=$subvalue中的[]加法;如果存在数组,将创建[0]。这是正确的,谢谢。$arr2[$arrkey][0][$subkey][]=$subvalue中的[]加法;应删除,因为它将为数组中的每个值创建[0]。对于第一个循环,这是正确的,但我必须对每个节点执行相同的操作,这意味着我必须为递归的每个节点再次调用此函数。我不知道这个阵列的深度。需要一些建议,谢谢Amit Sharma,非常感谢您的回复。对不起,我是新手,所以我会花更长的时间来组合你的答案。$arr1[$arrkey][$subkey][]=$subvalue中的[]加法;如果存在数组,将创建[0]。这是正确的,谢谢。$arr2[$arrkey][0][$subkey][]=$subvalue中的[]加法;应删除,因为它将为数组中的每个值创建[0]。对于第一个循环,这是正确的,但我必须对每个节点执行相同的操作,这意味着我必须为递归的每个节点再次调用此函数。我不知道这个阵列的深度。需要一些建议,谢谢你的帮助。您的递归函数是正确的,我添加了“if(is_数组($arrvalue)&&&!isset($arrvalue[0])”,因此如果其中已经有[0],它就不会创建新的[]。我遗漏的另一件事是,当子对象是数组时,不需要创建[0]。因此,如果[Customer]->[Address],则不需要[Customer]->[0]->[Address]。如果你对此有任何建议,非常感谢。嗨,奈杰尔,非常感谢你的帮助。您的递归函数是正确的,我添加了“if(is_数组($arrvalue)&&&!isset($arrvalue[0])”,因此如果其中已经有[0],它就不会创建新的[]。我遗漏的另一件事是,当子对象是数组时,不需要创建[0]。因此,如果[Customer]->[Address],则不需要[Customer]->[0]->[Address]。如果您对此有任何建议,非常感谢。