xml foreach, пропуская оператор if в php - PullRequest
1 голос
/ 03 апреля 2012

Вот что я пытаюсь достичь.Я импортирую XML-файл продуктов (тег продукта имеет атрибут id: в качестве примера.

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

Мой код выглядит следующим образом

<?php 
$flag='start';
foreach($xml->product as $product)
{
    $attrs = $product->attributes();
echo "$attrs ($flag)"; // just used for testing results
if ($flag != $attrs) {
echo "| <a href='xmltest.php?menuitem=$attrs'>".$product->category." </a><br>"; 
$flag=$attrs;
}

}
?>

Что должно произойти при первом запуске, флаг несоответствует attrs, ссылка отображается, флаг теперь соответствует attrs.

Если у меня есть 5 тегов продукта с идентификаторами 1,1,2,2,2, код должен повторить ссылку дважды (сначалакогда $ flag = start, пока $ attrs = 1, и когда $ flag = 1, а $ attrs = 2) ...

Вместо этого он повторяет это все 5 раз, в основном игнорируя оператор if.

Я не вижу, в чем я ошибаюсь, если заявление. Может ли кто-нибудь помочь?

Обновление Спасибо, душа, я пробовал ваши предложенияи я немного ближе, чем раньше.

Я сделал var_dump и результат я вижуЭто выглядит так:

flag var_dump result: string (5) "start" attrs var_dump result: object (SimpleXMLElement) # 6 (1) {["@attributes"] => array (1){["id"] => string (1) "0"}} 0 (0)

flag var_dump result: object (SimpleXMLElement) # 6 (1) {["@attributes"] => array(1) {["id"] => string (1) "0"}}

attrs var_dump result: object (SimpleXMLElement) # 5 (1) {["@attributes"] => array (1) {["id"] => string (1) "0"}} 0 (0)

flag var_dump result: object (SimpleXMLElement) # 5 (1) {["@attributes"] => array (1) {["id"] => string (1) "0"}}

attrs var_dump result: object (SimpleXMLElement) # 4 (1) {["@attributes"] =>array (1) {["id"] => string (1) "0"}} 1 (0)

flag var_dump result: object (SimpleXMLElement) # 4 (1) {["@attributes"] => array (1) {["id"] => string (1) "0"}}

attrs var_dump result: object (SimpleXMLElement) # 8 (1) {["@attributes"]=> array (1) {["id"] => string (1) "1"}} 1 (1)

flag var_dump result: object (SimpleXMLElement) # 8 (1) {["@attributes"] => array (1) {["id"] => string (1) "1"}}

Теперь я понимаю, как$ flag var начинается со строки и затем принимает значение массива.

Я пробовал if (!is_array ($ flag) && $ flag! = $ attrs) {но результаты были одинаковыми.

Есть ли другой способ получить значения, схожие для сравнения?

Еще раз спасибо,

ОБНОВЛЕНИЕ

Простой взрыв помог решить его.Вот код, который работает для меня.

<?php 
$flag='start';
foreach($xml->product as $product)
{
    $category = $product->category;
    $attrsvar = $product->attributes();
    $attrs = explode(" ", $attrsvar);

if( ! is_array($flag) && $flag != $attrs[0]) { 
echo " <a href='xmltest.php?menuitem=".$attrs[0]."'>".$category." </a> | "; 
$flag=$attrs[0]; 
    }
}
?>

1 Ответ

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

Вы хотите убедиться, что это не массив в первую очередь.

if( ! is_array($flag) && $flag != $attrs) { etc... }

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

Редактировать: Если он все еще не работает, попробуйте var_dump (), чтобы убедиться, что обе переменныетого же типа, когда их сравнивают.

Обновление: Вы знаете, что мы оба думаем над этим.Я предполагаю, что вы делаете что-то с этим XML, а не только получаете категории, в противном случае вы можете взглянуть на гораздо более простое решение XPATH ниже.Если вы делаете что-то большее с этим XML, вы можете просто сделать следующее.

$products = array();
foreach($xml->product as $product) {
    $id = $product['id'];
    $category = $product->category;

    if( ! in_array($id, $products)) {
        $products[$id] = $category;
        echo "| <a href='xmltest.php?menuitem=$attrs'>".$category." </a><br>"; 

    }
}

XPATH, если вы просто хотите работать с категориями.Дайте мне знать, если мой XPATH не совсем правильный, я не слишком хорош с ним в нормальных условиях, я бы не хотел думать, как плохо я мог бы повредить его при ухудшении сна.

$categories = $xml->xpath('//product/category');
$categories = array_unique($categories);
foreach($categories as $category) {
    echo "| <a href='xmltest.php?menuitem=$attrs'>".$category." </a><br>"; 
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...