对于多dim数组PHP上的每个逻辑

时间:2012-05-18 14:51:29

标签: php multidimensional-array for-loop

我有一个POST的多维数组

[key:value key:value[array one {key1:value, key2:value}{key1:value, key2:value}][array two{key1:value, key2:value}...] key:value key:value]

我正在使用嵌套数组生成xml条目,并按如下方式识别它们:

foreach ($_POST as $key){
        if (is_array($key)){
               foreach ($key as $key2 => $value){
                   $array_type = substr($key2, 0,2);
                    if ($array_type == 'ec'){
                        $xml .= '<tns:PersonNamesInfoType>';

                    if ($key2 == 'ec_fname'){
                        $xml .= '<GivenName>'.$value.'</GivenName>';
                        //<MidInitial>MidInitial</MidInitial>
                        }
                        else if ($key2 == 'ec_lname'){
                            $xml .= '<FamilyName>'.$value.'</FamilyName>';
                            //</tns:PersonNamesInfoType>
                            }
                        else if ($key2 == 'ec_rel'){
                            $xml .= ' <Relationship>'.$value.' </Relationship>';
                            // <tns:PhoneInfoType>
                            //<tns:PhoneType></tns:PhoneType>
                            }
                        else if ($key2 == 'ec_ophone'){
                            $xml .= '<Number>'.$value.'</Number>';
                            }
                        else {
                            $xml .= '<IsPrimary>'.$value.'</IsPrimary>';
                            }
                            $xml .= '</tns:PersonNamesInfoType>';
                   }
                   else if($array_type == 've') {
                       $xml .= '<tns:AutoInfoType>';

                        foreach ($key as $key2 => $value){

                            if ($key2 == 'veh_year'){
                            $xml .= '<Year>'.$value.'</Year>';
                            }
                            else if ($key2 == 'veh_make'){
                            $xml .= '<Make>'.$value.'</Make>';
                            }
                            else if ($key2 == 'veh_model'){
                            $xml .= '<Model>'.$value.'</Model>';
                            }
                            else if ($key2 == 'veh_plate'){
                            $xml .= '<Plate>'.$value.'</Plate>';
                            }
                            else if ($key2 == 'veh_state'){
                            $xml .= '<tns:StateType>'.$value.'</tns:StateType>';
                            }
                            else {$xml .= '<IsPrimary>'.$value.'</IsPrimary>';}

                }
            $xml .= '</tns:AutoInfoType>';
                   }

            }
    }
}

这会产生错误的结果

<tns:PersonNamesInfoType>
<GivenName>'.$value.'</GivenName>
</tns:PersonNamesInfoType>


<tns:PersonNamesInfoType>
<FamilyName>'.$value.'</FamilyName>
</tns:PersonNamesInfoType>

Instead of:

<tns:PersonNamesInfoType>
<GivenName>'.$value.'</GivenName>
<FamilyName>'.$value.'</FamilyName>
</tns:PersonNamesInfoType>

根据第一个键值来分隔每个数组的数据的最佳解决方案是什么

1[ec_fname]
1[veh_lname]
2[ec_fname]
2[veh_lname]

3 个答案:

答案 0 :(得分:1)

这将满足您的需求,并且更短,更简单,更容易扩展:

$personTags = array(
    "ec_fname" => "GivenName",
    "ec_lname" => "FamilyName",
    "ec_rel" => "Relationship",
    "ec_ophone" => "Number"
);

$vehicleTags = array(
    "veh_year" => "Year",
    "veh_make" => "Make",
    "veh_model" => "Model",
    "veh_plate" => "Plate",
    "veh_state" => "StateType"
);

$xml = "";
foreach ($_POST as $key)
{
    if (!is_array($key))
        continue;

    $personNamesInfoTypes = array();
    $autoInfoTypes = array();

    foreach ($key as $key2 => $value)
    {
        $array_type = substr($key2, 0, 2);
        if ($array_type == 'ec')
        {
            if (array_key_exists($key2, $personTags))
                $tag = $personTags[$key2];
            else
                $tag = "IsPrimary";

            $personNamesInfoTypes[] = " <{$tag}>{$value}</{$tag}>";
        }
        else if ($array_type == 've')
        {
            if (array_key_exists($key2, $vehicleTags))
                $tag = $vehicleTags[$key2];
            else
                $tag = "IsPrimary";

            $autoInfoTypes[] = "    <{$tag}>{$value}</{$tag}>";
        }
    }

    if (!empty($personNamesInfoTypes))
        $xml .= "<tns:PersonNamesInfoType>\n". implode("\n", $personNamesInfoTypes) ."\n</tns:PersonNamesInfoTypes>\n";
    if (!empty($autoInfoTypes))
        $xml .= "<tns:AutoInfoType>\n". implode("\n", $autoInfoTypes) ."\n</tns:AutoInfoTypes>\n";
}

看起来你的循环设置错误了(车辆部分有一个foreach循环,但是在person部分没有)并且每次创建子节点时都在创建一个新的父节点。

使用我的解决方案,而不是在每次循环迭代时将节点直接添加到字符串,而是将它们附加到数组,然后在该$_POST变量的末尾,将转储这两个数组一次进入正确的父节点。

如果您必须在人员部分或车辆部分添加其他可能的标签,您只需在$personTags$vehicleTags阵列中添加一个条目。

答案 1 :(得分:0)

您可能会注意您的代码格式。

不太清楚,foreach中有一个foreach,他们正在使用相同的&#34; $ key2&#34;和&#34; $ value&#34;。我猜你做的是&#34;}&#34;在错误的地方。

答案 2 :(得分:0)

“类型等于've'的第二个if条件 foreach 位于 if condition 之内。

else if($array_type == 've') {
$xml .= '<tns:AutoInfoType>';
foreach ($key as $key2 => $value){

但是在初始 if条件 “类型等于'ec'” foreach if条件<之外< / i>因此导致你的问题。

foreach ($key as $key2 => $value){
$array_type = substr($key2, 0,2);
if ($array_type == 'ec'){

我的解决方案

我建议的解决方案很简单......只需将foreach从第4行移到第7行,你的问题就应该解决了(每个需要在 if条件)。

if ($array_type == 'ec'){
$xml .= '<tns:PersonNamesInfoType>';
foreach ($key as $key2 => $value){

我已将完整的解决方案附加到我的答案:)

  foreach ($_POST as $key){
    if (is_array($key)){
               $array_type = substr($key2, 0,2);
                if ($array_type == 'ec'){
                    $xml .= '<tns:PersonNamesInfoType>';
                    foreach ($key as $key2 => $value){
                    if ($key2 == 'ec_fname'){
                        $xml .= '<GivenName>'.$value.'</GivenName>';
                        //<MidInitial>MidInitial</MidInitial>
                        }
                        else if ($key2 == 'ec_lname'){
                            $xml .= '<FamilyName>'.$value.'</FamilyName>';
                            //</tns:PersonNamesInfoType>
                            }
                        else if ($key2 == 'ec_rel'){
                            $xml .= ' <Relationship>'.$value.' </Relationship>';
                            // <tns:PhoneInfoType>
                            //<tns:PhoneType></tns:PhoneType>
                            }
                        else if ($key2 == 'ec_ophone'){
                            $xml .= '<Number>'.$value.'</Number>';
                            }
                        else {
                            $xml .= '<IsPrimary>'.$value.'</IsPrimary>';
                            }
                    }
                    $xml .= '</tns:PersonNamesInfoType>';
               }
               else if($array_type == 've') {
                   $xml .= '<tns:AutoInfoType>';

                    foreach ($key as $key2 => $value){

                        if ($key2 == 'veh_year'){
                        $xml .= '<Year>'.$value.'</Year>';
                        }
                        else if ($key2 == 'veh_make'){
                        $xml .= '<Make>'.$value.'</Make>';
                        }
                        else if ($key2 == 'veh_model'){
                        $xml .= '<Model>'.$value.'</Model>';
                        }
                        else if ($key2 == 'veh_plate'){
                        $xml .= '<Plate>'.$value.'</Plate>';
                        }
                        else if ($key2 == 'veh_state'){
                        $xml .= '<tns:StateType>'.$value.'</tns:StateType>';
                        }
                        else {$xml .= '<IsPrimary>'.$value.'</IsPrimary>';}

            }
        $xml .= '</tns:AutoInfoType>';
               }
}
}