PHP Amazon API продукта => Как перебрать массив неизвестных уровней ...? - PullRequest
1 голос
/ 17 марта 2012

Я пытаюсь перебрать массив browsenodes, который возвращает API продукта Amazon для запрошенного продукта с ItemLookup, но я не могу понять, как это сделать надежно, поскольку возвращаемый массив всегда имеет разное количество уровней.

Я искал здесь другие ответы, которые предлагают, например, итератор SimpleXML, но он не работает и выдает исключение, потому что он не может быть проанализирован как xml ...

Массив, который возвращаетсяАмазон выглядит так:

[BrowseNodes] => SimpleXMLElement Object
    (
        [BrowseNode] => Array
            (
                [0] => SimpleXMLElement Object
                    (
                        [BrowseNodeId] => 172659
                        [Name] => Televisions
                        [Ancestors] => SimpleXMLElement Object
                            (
                                [BrowseNode] => SimpleXMLElement Object
                                    (
                                        [BrowseNodeId] => 1266092011
                                        [Name] => Television & Video
                                        [Ancestors] => SimpleXMLElement Object
                                            (
                                                [BrowseNode] => SimpleXMLElement Object
                                                    (
                                                        [BrowseNodeId] => 493964
                                                        [Name] => Categories
                                                        [IsCategoryRoot] => 1
                                                        [Ancestors] => SimpleXMLElement Object
                                                            (
                                                                [BrowseNode] => SimpleXMLElement Object
                                                                    (
                                                                        [BrowseNodeId] => 172282
                                                                        [Name] => Electronics
                                                                    )

                                                            )

                                                    )

                                            )

                                    )

                            )

                    )

Или это, например:

[BrowseNodes] => SimpleXMLElement Object
                    (
                        [BrowseNode] => SimpleXMLElement Object
                            (
                                [BrowseNodeId] => 3764321
                                [Name] => Chin Strips
                                [Ancestors] => SimpleXMLElement Object
                                    (
                                        [BrowseNode] => SimpleXMLElement Object
                                            (
                                                [BrowseNodeId] => 702368011
                                                [Name] => Snore Reducing Aids
                                                [Ancestors] => SimpleXMLElement Object
                                                    (
                                                        [BrowseNode] => SimpleXMLElement Object
                                                            (
                                                                [BrowseNodeId] => 3764271
                                                                [Name] => Sleep & Snoring
                                                                [Ancestors] => SimpleXMLElement Object
                                                                    (
                                                                        [BrowseNode] => SimpleXMLElement Object
                                                                            (
                                                                                [BrowseNodeId] => 3760941
                                                                                [Name] => Health Care
                                                                                [Ancestors] => SimpleXMLElement Object
                                                                                    (
                                                                                        [BrowseNode] => SimpleXMLElement Object
                                                                                            (
                                                                                                [BrowseNodeId] => 3760931
                                                                                                [Name] => Products
                                                                                                [IsCategoryRoot] => 1
                                                                                                [Ancestors] => SimpleXMLElement Object
                                                                                                    (
                                                                                                        [BrowseNode] => SimpleXMLElement Object
                                                                                                            (
                                                                                                                [BrowseNodeId] => 3760901
                                                                                                                [Name] => Health & Personal Care
                                                                                                            )

                                                                                                    )

                                                                                            )

                                                                                    )

                                                                            )

                                                                    )

                                                            )

                                                    )

                                            )

                                    )

                            )

                    )

            )

    )

)

Мне как-то нужно надежно перебрать все элементы на первом уровне массива, которые содержат категорию иинформация подкатегории.

если в массиве больше уровней [1], [2] и т. д., их нужно будет пропустить.

Информация, которая мне нужна, всегда находится на первом уровне-> имяа затем последний уровень-> name, где iscategoryroot => 1

Но так как глубина всегда различна, я просто не могу понять, как это сделать: (

Что можетЯ делаю в этой ситуации?Как бы я зациклился на таких массивах?

Спасибо!:)


РЕДАКТИРОВАТЬ:


Итак, я подключаю к API с помощью curl, и строю из него объект simplexml:

/* include stuff */
include("amazon_api_class.php");
include("functions.php");

// create new amazon object
$obj = new AmazonProductAPI();

try 
    {
        $result = $obj->getItemByAsin("B004NPND20,B004VRJ3E2,B000EM91FY,B00004Z2HD,B00004Z2HR,B00004Z2HZ,B00002ND60,B000N54BDO,B000BQKBCK,B0000225IO");


    } catch(Exception $e) 
    {
        echo $e->getMessage();
    }


// loop over the returned object and extract the details we need
foreach($result->Items->Item as $key => $item){

Затемполный вывод массива просмотра узлов выглядит следующим образом (но всегда отличается)

[BrowseNodes] => SimpleXMLElement Object
    (
        [BrowseNode] => Array
            (
                [0] => SimpleXMLElement Object
                    (
                        [BrowseNodeId] => 172659
                        [Name] => Televisions
                        [Ancestors] => SimpleXMLElement Object
                            (
                                [BrowseNode] => SimpleXMLElement Object
                                    (
                                        [BrowseNodeId] => 1266092011
                                        [Name] => Television & Video
                                        [Ancestors] => SimpleXMLElement Object
                                            (
                                                [BrowseNode] => SimpleXMLElement Object
                                                    (
                                                        [BrowseNodeId] => 493964
                                                        [Name] => Categories
                                                        [IsCategoryRoot] => 1
                                                        [Ancestors] => SimpleXMLElement Object
                                                            (
                                                                [BrowseNode] => SimpleXMLElement Object
                                                                    (
                                                                        [BrowseNodeId] => 172282
                                                                        [Name] => Electronics
                                                                    )

                                                            )

                                                    )

                                            )

                                    )

                            )

                    )

                [1] => SimpleXMLElement Object
                    (
                        [BrowseNodeId] => 13900851
                        [Name] => Electronics Features
                        [Children] => SimpleXMLElement Object
                            (
                                [BrowseNode] => Array
                                    (
                                        [0] => SimpleXMLElement Object
                                            (
                                                [BrowseNodeId] => 51549011
                                                [Name] => Featured Categories
                                            )

                                        [1] => SimpleXMLElement Object
                                            (
                                                [BrowseNodeId] => 3302711
                                                [Name] => Gold Merchants
                                            )

                                        [2] => SimpleXMLElement Object
                                            (
                                                [BrowseNodeId] => 2354568011
                                                [Name] => Specialty Boutique
                                            )

                                    )

                            )

                        [Ancestors] => SimpleXMLElement Object
                            (
                                [BrowseNode] => SimpleXMLElement Object
                                    (
                                        [BrowseNodeId] => 172282
                                        [Name] => Electronics
                                    )

                            )

                    )

                [2] => SimpleXMLElement Object
                    (
                        [BrowseNodeId] => 1288264011
                        [Name] => All product
                        [Ancestors] => SimpleXMLElement Object
                            (
                                [BrowseNode] => SimpleXMLElement Object
                                    (
                                        [BrowseNodeId] => 1267878011
                                        [Name] => Products
                                        [IsCategoryRoot] => 1
                                        [Ancestors] => SimpleXMLElement Object
                                            (
                                                [BrowseNode] => SimpleXMLElement Object
                                                    (
                                                        [BrowseNodeId] => 1267877011
                                                    )

                                            )

                                    )

                            )

                    )

                [3] => SimpleXMLElement Object
                    (
                        [BrowseNodeId] => 3545110011
                        [Name] => Home Entertainment
                        [Children] => SimpleXMLElement Object
                            (
                                [BrowseNode] => Array
                                    (
                                        [0] => SimpleXMLElement Object
                                            (
                                                [BrowseNodeId] => 3547652011
                                                [Name] => Blu-Ray Players
                                            )

                                        [1] => SimpleXMLElement Object
                                            (
                                                [BrowseNodeId] => 3547650011
                                                [Name] => DVD Players
                                            )

                                        [2] => SimpleXMLElement Object
                                            (
                                                [BrowseNodeId] => 1294446011
                                                [Name] => Televisions
                                            )

                                    )

                            )

                        [Ancestors] => SimpleXMLElement Object
                            (
                                [BrowseNode] => SimpleXMLElement Object
                                    (
                                        [BrowseNodeId] => 1294447011
                                        [Name] => Electronics
                                        [Ancestors] => SimpleXMLElement Object
                                            (
                                                [BrowseNode] => SimpleXMLElement Object
                                                    (
                                                        [BrowseNodeId] => 1267878011
                                                        [Name] => Products
                                                        [IsCategoryRoot] => 1
                                                        [Ancestors] => SimpleXMLElement Object
                                                            (
                                                                [BrowseNode] => SimpleXMLElement Object
                                                                    (
                                                                        [BrowseNodeId] => 1267877011
                                                                    )

                                                            )

                                                    )

                                            )

                                    )

                            )

                    )

                [4] => SimpleXMLElement Object
                    (
                        [BrowseNodeId] => 1293318011
                        [Name] => TVs
                        [Ancestors] => SimpleXMLElement Object
                            (
                                [BrowseNode] => SimpleXMLElement Object
                                    (
                                        [BrowseNodeId] => 1267879011
                                        [Name] => Special Features
                                        [Ancestors] => SimpleXMLElement Object
                                            (
                                                [BrowseNode] => SimpleXMLElement Object
                                                    (
                                                        [BrowseNodeId] => 1267877011
                                                    )

                                            )

                                    )

                            )

                    )

                [5] => SimpleXMLElement Object
                    (
                        [BrowseNodeId] => 1293319011
                        [Name] => Electronics
                        [Ancestors] => SimpleXMLElement Object
                            (
                                [BrowseNode] => SimpleXMLElement Object
                                    (
                                        [BrowseNodeId] => 1267879011
                                        [Name] => Special Features
                                        [Ancestors] => SimpleXMLElement Object
                                            (
                                                [BrowseNode] => SimpleXMLElement Object
                                                    (
                                                        [BrowseNodeId] => 1267877011
                                                    )

                                            )

                                    )

                            )

                    )

            )

    )

)

И мне всегда нужен только первый ключ массива, а затем первый и последний подпункт там

1 Ответ

5 голосов
/ 17 марта 2012

Я не уверен, правильно ли я понял, но вы, вероятно, можете взять идею отсюда.

function getCategory($node) {
    $category = array();
    $category["Category"] = (string)$node->Name;

    if (isset($node->Ancestors)) {
        do {
            $node = $node->Ancestors->BrowseNode;
            if (isset($node->IsCategoryRoot) && isset($node->Ancestors)) {
                $category["Root"] = (string)$node->Ancestors->BrowseNode->Name;
                break;
            }
        } while (isset($node->Ancestors));
    }

    return $category;
}

Вы могли бы легко сделать это и с рекурсивной функцией, но я считаю, что она более читабельна. (и эффективный тоже).

...