1

ユーザーのリストを提供しているシステムに接続しています。データは「ツリー形式」で表示されるため、親子関係を確認できます。これはほとんどリセラー ツリーのようなものです。

XML を再帰的に調べて、親 ID を取得し、子 ID レコードを記録する方法がわかりません。問題は、一部の子 ID が親 ID になる可能性があることです。

また、各レコードは属性のみで構成されているため、XML から特定の UserID に直接アクセスする方法もわかりません。

XML のサンプル コピーを次の URL にアップロードしました: http://www.fluffyduck.com.au/sampleXML.txt

私はSimpleXMLでこれをやろうとしていますが、子供の子供をループダウンする方法がほとんどないようです。

どんな助けでも大歓迎です!これは私が完全に困惑しているので。

4

3 に答える 3

1

これは機能し、147 個の SimpleXMLElement の配列を返します (配列のように使用できます)。

$content = file_get_contents('http://www.fluffyduck.com.au/sampleXML.txt');
$xml = new SimpleXMLElement($content);
$users = myUserReader($xml->user);

function myUserReader($node)
{
    $users = array ();
    $users[] = $node->attributes();
    foreach ($node as $user)
    {
        $users[] = $user->attributes();
        if (isset($user->user))
        {
            $users = array_merge($users, myUserReader($user->user));
        }
    }
    return $users;
}

// displays 147 children
var_dump($users);

// displays 147
echo count($users);
于 2012-09-11T05:51:27.203 に答える
0
$xml = new SimpleXMLElement($xml_str);
$user = $xml->user;

while($curr_user = $curr_user->children('user'))
{
    // do some code
    $attr = array(
        $curr_user['id'],
        $curr_user['username'],
        $curr_user['firstname'],
        // ...etc
        );
}

したがって、これは使用法と子ノードの検索の例にすぎません。すべての配列をウォークスルーするには、このコードのような再帰関数を使用できます。

編集:
Ninsuo コードをコピーするのは申し訳ありませんが、完璧なものです :)

$content = file_get_contents('http://www.fluffyduck.com.au/sampleXML.txt');
$xml = new SimpleXMLElement($content);
$users = myUserReader($xml->user);

function myUserReader($node,$str)
{
    $users = array ();
    $users[] = $node->attributes();
    foreach ($node as $user)
    {
        $users[] = $user->attributes();
        if (isset($user->user))
        {
            $str .= '<ul>'.$user['fisrt_name'];
            $users = array_merge($users, myUserReader($user->user));
            $str .= '</ul>';
        }
        else $str .= '<li>'.$user['fisrt_name'].'</li>';
    }
    return $users,$str;
}
于 2012-09-11T05:29:58.313 に答える
0

親/子の配列を取得するには、次を使用できます。

<?php

$content = file_get_contents('http://www.fluffyduck.com.au/sampleXML.txt');
$xml = new SimpleXMLElement($content);

$users = array ();
myUserReader($xml->user, $users);

function myUserReader($node, &$users)
{
    if (array_key_exists("{$node['id']}", $users) === false)
    {
        $users["{$node['id']}"] = array ();
    }
    if (isset($node->user))
    {
        for ($key = 0; ($key < $node->user->count()); $key++)
        {
            $user = $node->user[$key];
            if (!in_array("{$node['id']}", $users["{$node['id']}"]))
            {
                $users["{$node['id']}"][] = "{$user['id']}";
            }
            myUserReader($user, $users);
        }
    }
}

foreach ($users as $parent => $children)
{
    echo "{$parent}: " . implode(", ", $children) . "\n";
}
?>

これは出力します:

41: 61, 62, 69, 89, 127, 204, 323, 340, 341
61: 
62: 64, 78, 80, 116, 120
64: 66
66: 67
67: 68, 114, 161, 162, 166, 203
68: 70
70: 72, 77, 104, 118, 135, 138, 143, 154, 156, 171, 172, 173, 174
72: 73, 86, 163, 165, 167
73: 75
75: 
86: 92, 103, 108, 112, 117, 119, 121, 124, 125, 137, 144
92: 107, 110, 111, 142
107: 
110: 
111: 
142: 
103: 
108: 
112: 
117: 
119: 
121: 
124: 
125: 
137: 
144: 
163: 
165: 
167: 
77: 79, 113
79: 
113: 
104: 106
106: 
118: 
135: 
138: 
143: 
154: 
156: 
171: 
172: 
173: 
174: 
114: 
161: 
162: 
166: 169, 175, 176, 178, 179, 180, 183, 184, 205, 206
169: 
175: 
176: 
178: 
179: 
180: 
183: 
184: 
205: 
206: 
203: 
78: 136
136: 
80: 101
101: 
116: 122, 126, 129, 130, 131, 133, 139, 140, 141
122: 
126: 
129: 
130: 
131: 
133: 
139: 
140: 
141: 
120: 145, 146, 147, 148, 149, 150, 151, 157, 160, 168
145: 
146: 
147: 
148: 
149: 
150: 152, 153, 155, 159
152: 
153: 
155: 
159: 
151: 
157: 
160: 
168: 
69: 
89: 
127: 
204: 207
207: 208, 209, 210, 211, 212, 227, 254, 300
208: 213, 214, 215, 226, 228, 234, 255, 294, 295, 297, 299, 320
213: 
214: 
215: 
226: 
228: 
234: 
255: 274, 275
274: 
275: 
294: 
295: 
297: 
299: 
320: 
209: 
210: 217, 218, 222
217: 
218: 
222: 
211: 
212: 
227: 
254: 
300: 
323: 
340: 
341: 
于 2012-09-11T07:56:42.740 に答える