0

私はなぜこれが起こっているのか(私が認めたいよりもかなり多くの時間を費やした)と本当に混乱しています。基本的に、Dateに到達すると、配列に日付は追加されませんが、Timeは完全に問題ありません。

XMLコードの例

<xml>
<Route id="1">
    <itdDateTime>
        <itdDate day="28" month="10" year="2012" weekday="-1"/>
        <itdTime hour="12" minute="53"/>
    </itdDateTime>
</Route>
<Route id="2">
    <itdDateTime>
        <itdDate day="3" month="12" year="2012" weekday="-1"/>
        <itdTime hour="8" minute="14"/>
    </itdDateTime>
</Route>
<Route id="3">
    <itdDateTime>
        <itdDate day="3" month="12" year="2012" weekday="-1"/>
        <itdTime hour="9" minute="16"/>
    </itdDateTime>
</Route>

PHPコード例

foreach($route->childNodes as $node) {
    if ($node->nodeName == 'itdDateTime') {
        foreach ($node->childNodes as $child) {
            $dateAttr = $child->attributes;
            $x[$i]['leave'] = array();
            $x[$i]['leave']['date'] = array();
            $x[$i]['leave']['time'] = array();
            foreach ($dateAttr as $index=>$attr) {
                $x[$i][$attr->nodeName] = $attr->nodeValue;             
                if ($index == 'minute' || $index == 'hour') {
                    $x[$i]['leave']['time'][$attr->nodeName] = $attr->nodeValue;
                } else {
                    $x[$i]['leave']['date'][$attr->nodeName] = $attr->nodeValue;
                }
            }
        }
    }
}

配列の例

    Array
(
    [0] => Array
        (
            [active] => 1
            [delete] => 0
            [changes] => 2
            [distance] => 966
            [alternative] => 0
            [publicDuration] => 01:19
            [individualDuration] => 00:22
            [print] => 0
            [routeIndex] => 1
            [hasFrequency] => 1
            [routeTripIndex] => 1
            [cTime] => 20121028113640847
            [searchMode] => 1
            [vehicleTime] => 53
            [method] => itp
            [selected] => 1
            [leave] => Array
                (
                    [date] => Array
                        (
                        )

                    [time] => Array
                        (
                            [hour] => 12
                            [minute] => 53
                        )

                )

            [day] => 28
            [month] => 10
            [year] => 2012
            [weekday] => 1
            [hour] => 12
            [minute] => 53
        )

問題

つまり、基本的に問題は、日付(日、月、平日)を[leave] [date] ..(例)[leave][date][day]に入力する必要があるということです。

IFステートメントがなくても、それを[leave]配列に入力するだけでは、たとえば機能しません。

$x[$i]['leave'][$attr->nodeName] = $attr->nodeValue;

したがって、Imは基本的に不明であり、最初の配列に表示される理由を理解していません(例のようにLeaveの横など)

$x[$i][$attr->nodeName] = $attr->nodeValue;

これに関するアドバイスや助けをいただければ幸いです。

4

1 に答える 1

1
foreach ($node->childNodes as $child) {
    ...
    $x[$i]['leave'] = array();
    $x[$i]['leave']['date'] = array();
    $x[$i]['leave']['time'] = array();
    ...
}

このループは foritdDateitdTimeの 2 回実行され、2 回目の繰り返しでわかるように、以前に入力された配列が空の配列で上書きされます。

上書きする前にこれらの配列が存在しないかどうかを確認するか、itdDateTime子ノードをループする前に定義を移動する必要があります。

if ($node->nodeName == 'itdDateTime') {
    $x[$i]['leave'] = array();
    $x[$i]['leave']['date'] = array();
    $x[$i]['leave']['time'] = array();
    foreach ($node->childNodes as $child) {
        $dateAttr = $child->attributes;
        foreach ($dateAttr as $index=>$attr) {
            $x[$i][$attr->nodeName] = $attr->nodeValue;             
            if ($index == 'minute' || $index == 'hour') {
                $x[$i]['leave']['time'][$attr->nodeName] = $attr->nodeValue;
            } else {
                $x[$i]['leave']['date'][$attr->nodeName] = $attr->nodeValue;
            }
        }
    }
}
于 2012-10-28T12:23:25.533 に答える