Как сравнить элементы из XML и добавить новый узел с 3 или более возможными результатами, используя PHP? - PullRequest
0 голосов
/ 03 апреля 2019

У меня есть список продуктов в формате XML, и мне нужно назначить вес нового узла для каждого продукта в зависимости от категории каждого продукта.Например:

У меня есть следующий XML:

<?xml version="1.0" encoding="utf-8"?>
<products>
  <item>
    <name>PRODUCT 1</name>
    <category>CATEGORY 1</category>
  </item>
  <item>
    <name>PRODUCT 2</name>
    <category>CATEGORY 2</category>
  </item>
  <item>
    <name>PRODUCT 3</name>
    <category>CATEGORY 3</category>
  </item>
  <item>
    <name>PRODUCT 4</name>
    <category>CATEGORY 4</category>
  </item>
  <item>
    <name>PRODUCT 5</name>
    <category>CATEGORY 5</category>
  </item>
  <item>
    <name>PRODUCT 6</name>
    <category>CATEGORY 6</category>
  </item>
  <item>
    <name>PRODUCT 7</name>
    <category>CATEGORY 7</category>
  </item>
  <item>
    <name>PRODUCT 8</name>
    <category>CATEGORY 8</category>
  </item>
</products>

Я пытался использовать этот код, используя мою логику, но не работает:

<?php

//CODE...

$weight = $xml->xpath("//item[category]");
foreach ( $weight as $value )    {
    $value->weight = ($value->category=='CATEGORY 1' or $value->category=='CATEGORY 2' or $value->category=='CATEGORY 3')? 1:2 and ($value->category=='CATEGORY 4' or $value->category=='CATEGORY 5')? 7:2 and ($value->category=='CATEGORY 6' or $value->category=='CATEGORY 7')? 10:2;
}

//MORE CODE...

?>

Как вывидно, что я пытался присвоить вес "1 кг", если продукты относятся к категориям 1, 2 и 3, "7 кг", если они относятся к категориям 4 и 5, и, наконец, "10 кг", если они включеныкатегории 6 и 7, но если они не соответствуют ни одной из этих категорий, установите вес в «2 кг», чтобы получить результат, подобный этому:

<?xml version="1.0" encoding="utf-8"?>
<products>
  <item>
    <name>PRODUCT 1</name>
    <category>CATEGORY 1</category>
    <weight>1</weight>
  </item>
  <item>
    <name>PRODUCT 2</name>
    <category>CATEGORY 2</category>
    <weight>1</weight>
  </item>
  <item>
    <name>PRODUCT 3</name>
    <category>CATEGORY 3</category>
    <weight>1</weight>
  </item>
  <item>
    <name>PRODUCT 4</name>
    <category>CATEGORY 4</category>
    <weight>7</weight>
  </item>
  <item>
    <name>PRODUCT 5</name>
    <category>CATEGORY 5</category>
    <weight>7</weight>
  </item>
  <item>
    <name>PRODUCT 6</name>
    <category>CATEGORY 6</category>
    <weight>10</weight>
  </item>
  <item>
    <name>PRODUCT 7</name>
    <category>CATEGORY 7</category>
    <weight>10</weight>
  </item>
  <item>
    <name>PRODUCT 8</name>
    <category>CATEGORY 8</category>
    <weight>2</weight>
  </item>
</products>

У меня такое ощущение, что это довольно простоно моя логика не дала результатов.Любая помощь будет оценена.

1 Ответ

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

Вы должны быть осторожны при использовании таких длинных цепных троичных операторов, так как могут быть проблемы с порядком, в котором он оценивается.Я хотел бы сделать две вещи: сначала извлечь только последний символ, а затем просто построить условие на основе этого.Второй - использовать скобки вокруг каждого условия, чтобы вы могли убедиться, что каждый ?: вычислен в правильном порядке ...

foreach ( $weight as $value )    {
    $cat = substr((string)$value->category, -1);
    $value->weight = ($cat==1 || $cat==2 || $cat==3)? 1:
        (($cat==4 || $cat==5)? 7:
        (($cat==6 || $cat==7)? 10:2));
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...