Использование SimpleXML для чтения нескольких URL-адресов и организации данных - PullRequest
0 голосов
/ 03 января 2012

Я на самом деле новичок в PHP - я только недавно начал изучать, чтобы интегрировать мой сайт с API.Пока все прошло очень хорошо, однако я не смог найти информацию, касающуюся моей проблемы.

Цель: использовать внешний API для извлечения «Заказы», ​​«Продукты» и «Пакеты».После этого разрешите экспортировать список зарегистрированных заказов пользователя (прошлые и активные) вместе со всей важной информацией.

Что работает: она извлекает информацию и публикует ее.

Что не't: API использует «нумерацию страниц», и я не могу обойти это ограничение.Как пример, в настоящее время есть 22 заказа.Если я вызову API, он отправит первые 10, и они будут выведены без ошибок.Чтобы получить больше, я могу добавить "per_page" и "page = #" в конец.Но я могу сделать это только вручную.Например, если я жестко закодирую адрес с помощью «per_page = 20», он покажет все 20. Но проблема в том, что я не всегда знаю, сколько вытащить, и если я пытаюсь вытащить 23 (на 1 больше, чем есть), это просто ошибкии ничего не загружается.

Чтобы показать код, который я сейчас использую (он был значительно сокращен, чтобы показать важные части):

<?php
$packages = 'http://MYKEY@api.digitaldeliveryapp.com/packages.xml';
$products = 'http://MYKEY@api.digitaldeliveryapp.com/products.xml';
$orders = 'http://MYKEY@api.digitaldeliveryapp.com/orders.xml';

$packagelist = new SimpleXMLElement($packages,null,true);
$productlist = new SimpleXMLElement($products,null,true);
$orderslist = new SimpleXMLElement($orders,null,true);

foreach($productlist->children() as $child) {
  echo $child->getName().":
";

  foreach($child->children() as $subchild) {
    echo "<br />--->".$subchild->getName().": ".$subchild."
";
  }
}


foreach($orderslist->children() as $child) {
  echo $child->getName().":
";

  foreach($child->children() as $subchild) {
    echo "<br />--->".$subchild->getName().": ".$subchild."
";
  }
}
?>

Наряду с этим, я 'Мне любопытно, эффективен ли мой итерационный метод.Как есть, я использую следующее (он настроен на чтение в списке заказов и сравнение адреса электронной почты и имени сайта со списком. Если он попадает, он берет идентификационный номер покупки и анализирует пакеты и списки продуктов, чтобы вытащить именао покупках):

foreach($orderslist as $child) {
    $purchaser = $child->{'buyer-name'};
    $email_addy = $child->{'buyer-email'};
    $download_url = $child->{'download-url'};
    $valid = $child->{'valid-until'};
    $expires = date("F j, Y", strtotime("$valid"));
    $product_id = $child->{'product-id'};
    $package_id = $child->{'package-id'};
    if ($email_addy == "$activeEmail" && $purchaser == "$usersName" && ($child->state == "complete" || $child->state == "free")){
        foreach($productlist as $testing){
            if ($product_id == "{$testing->id}"){
    echo "<tr><td>{$testing->name}</td> <td><a href=\"$download_url\">Download</a></td> <td>$expires<br /></td></tr>";
    }
}

Наконец, у меня есть проблема с настройкой, так как по мере того, как система получает больше покупок, читаемый список будет становиться все длиннее и длиннее.Таким образом, каждый раз, когда кто-то посещает страницу своего аккаунта, он вытягивает этот список, чтобы получить самую актуальную информацию.Есть ли более эффективный способ справиться с этим?

Документация API: http://www.digitaldeliveryapp.com/developers/api/introduction

Заранее спасибо!Как вы можете видеть, я очень новичок в этом, но это был большой опыт обучения!

1 Ответ

0 голосов
/ 03 января 2012

Вы используете Simplexml в качестве синтаксического анализатора, поскольку вы уже упоминали, что список заказов может быстро расти, поэтому я думаю, что вы можете лучше использовать domdocument, потому что это не загрузит весь xml в памяти. Также я буду сохранять заказы в базе данных и запрашивать только новые заказы из API. Таким образом, вы также можете запросить в своей базе данных только заказы этого клиента.

...