За последние 24 часа нас посетили 21983 программиста и 996 роботов. Сейчас ищут 752 программиста ...

xml Сортировка по тегам

Тема в разделе "Сделайте за меня", создана пользователем kadet166, 15 мар 2022.

Метки:
  1. kadet166

    kadet166 Новичок

    С нами с:
    15 мар 2022
    Сообщения:
    13
    Симпатии:
    5
    Всем привет!
    Есть файл xml нужно выгрузить его на сайт и отсортировать его по цвету (color)
    Код (Text):
    1. <yml>
    2.           <shop>
    3.             <offer>
    4.                <price>200</price>
    5.                <vendor>Vendor</vendor>
    6.                <color>RED</color>
    7.              </offer>
    8.             <offer>
    9.             <offer>
    10.                <price>300</price>
    11.                <vendor>Vendor</vendor>
    12.                <color>RED</color>
    13.              </offer>
    14.             <offer>
    15.                <price>100</price>
    16.                <vendor>Vendor</vendor>
    17.                <color>blue</color>
    18.              </offer>
    19.             <offer>
    20.                <price>100</price>
    21.                <vendor>Vendor</vendor>
    22.                <color>green</color>
    23.              </offer>
    24.            </shop>
    25. </yml>
    Код (Text):
    1. $xml = simplexml_load_file('export.xml');
    2.  
    3. foreach ($xml->shop->offer as $producs)
    4. if ( (string) $xml->shop->offer->color == "REG" ) {  ?>
    5.     <tr>
    6.         <td><?php echo $producs->price; ?></td>
    7.     </tr>
    8. }
    Должно вывести
    200
    300
    Но если убрать конструкцию if ( (string) $xml->shop->offer->color == "REG" ) то выводится весь файл xml, если оставить то не выводится ничего.
    Подскажите что не так. Заранее спасибо.
     
  2. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.822
    Симпатии:
    736
    Адрес:
    Татарстан
    так понимать надо хоть немного чего пишете
    PHP:
    1. foreach ($xml->shop->offer as $producs)
    2. if ( (string) $xml->shop->offer->color != "RED" ) {  ?>
    3.     <tr>
    4.         <td><?php echo $producs->price; ?></td>
    5.     </tr>
    6. }
    вот так будут выводиться все записи у которых цвет НЕ RED
    если нужно отсортировать - сначала загоняете данные в массив - сортируете- выводите массив
     
  3. kadet166

    kadet166 Новичок

    С нами с:
    15 мар 2022
    Сообщения:
    13
    Симпатии:
    5
    В принципе другого ответа я и не ожидал.
    Нет, не будет.
     
  4. antoniii

    antoniii Активный пользователь

    С нами с:
    16 мар 2022
    Сообщения:
    417
    Симпатии:
    71
    @kadet166 Вы еще ищете ответ на свой вопрос?
     
  5. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.822
    Симпатии:
    736
    Адрес:
    Татарстан
    будет .... разницу между REG и RED чувствуете?
     
  6. antoniii

    antoniii Активный пользователь

    С нами с:
    16 мар 2022
    Сообщения:
    417
    Симпатии:
    71
    Мне уже нечего сказать...
     
  7. kadet166

    kadet166 Новичок

    С нами с:
    15 мар 2022
    Сообщения:
    13
    Симпатии:
    5
    Да опечаточка вышла, но даже если изменить на RED все равно не работает :(
     
  8. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.822
    Симпатии:
    736
    Адрес:
    Татарстан
    если еще бы весь код видеть вывод ..а не кусок....

    я б лучше так сделал
    PHP:
    1. $xml = simplexml_load_file('export.xml');
    2. foreach ($xml->shop->offer as $producs) {
    3. if ( (string) $xml->shop->offer->color != "RED" ) {
    4.     echo "<tr>
    5.        <td>{$producs->price}</td>
    6.    </tr>";
    7. }
    8. }
    предполагается что заголовок таблицы и ее завершение - где то там у вас выводятся
     
  9. kadet166

    kadet166 Новичок

    С нами с:
    15 мар 2022
    Сообщения:
    13
    Симпатии:
    5
    Да выводятся, сейчас пробую элементы xml (в моем случаи color) записать в переменные и уже потом проверять на равенство. На самом деле мне это не очень прям надо, просто хочется разобраться, и если получится то буду внедрять в свой сайт если нет то ну и ладно )
     
  10. antoniii

    antoniii Активный пользователь

    С нами с:
    16 мар 2022
    Сообщения:
    417
    Симпатии:
    71
    У вас корневой тэг <yml>
     
  11. twim32

    twim32 Активный пользователь

    С нами с:
    29 мар 2017
    Сообщения:
    275
    Симпатии:
    58
    Зачем равенство? Всё просто как дважды два:
    PHP:
    1. <?php
    2.  
    3. $xml = [
    4.     [
    5.         'name' => 'a',
    6.         'color' => 'red',
    7.     ],
    8.     [
    9.         'name' => 'b',
    10.         'color' => 'red',
    11.     ],
    12.     [
    13.         'name' => 'c',
    14.         'color' => 'green',
    15.     ],
    16.     [
    17.         'name' => 'd',
    18.         'color' => 'white',
    19.     ],
    20. ];
    21.  
    22. // Собирем все цвета из массива
    23. $colors = array_map(function($product){
    24.     return $product['color'];
    25. }, $xml);
    26.  
    27. // Выбираем уникальные цвета
    28. $uniques = array_unique($colors);
    29.  
    30. // Для каждого цвета фильтруем массив и выводим
    31. foreach($uniques as $color) {
    32.     echo "Color: {$color}\n";
    33.     $products = array_filter($xml, function($product) use($color) {
    34.         return $color == $product['color'];
    35.     });
    36.     var_dump($products);
    37.     echo "\n==================\n";
    38. }
    Color: red
    array(2) {
    [0]=>
    array(2) {
    ["name"]=>
    string(1) "a"
    ["color"]=>
    string(3) "red"
    }
    [1]=>
    array(2) {
    ["name"]=>
    string(1) "b"
    ["color"]=>
    string(3) "red"
    }
    }

    ==================
    Color: green
    array(1) {
    [2]=>
    array(2) {
    ["name"]=>
    string(1) "c"
    ["color"]=>
    string(5) "green"
    }
    }

    ==================
    Color: white
    array(1) {
    [3]=>
    array(2) {
    ["name"]=>
    string(1) "d"
    ["color"]=>
    string(5) "white"
    }
    }

    ==================

     
  12. antoniii

    antoniii Активный пользователь

    С нами с:
    16 мар 2022
    Сообщения:
    417
    Симпатии:
    71
    Вы вместо того чтобы помочь, отвлекаете человека от его ошибки в коде. И в формате xml корневой тэг должен быть один, а тут их два. Еще дублируются открывающие тэги offer и структура документа неверная.
     
  13. antoniii

    antoniii Активный пользователь

    С нами с:
    16 мар 2022
    Сообщения:
    417
    Симпатии:
    71
    Используйте var_dump($xml);
     
  14. antoniii

    antoniii Активный пользователь

    С нами с:
    16 мар 2022
    Сообщения:
    417
    Симпатии:
    71
    Код (Text):
    1. <?php
    2. $xml = simplexml_load_file('file.xml');
    3. echo "<table border=\"1\" cellspacing=\"0\"cellpadding=\"4\">";
    4. foreach ($xml->offer as $products=>$value)
    5.   if ( (string) $value->color == "RED" )  {  ?>
    6.     <tr>
    7.         <td><?php echo $value->price; ?></td>
    8.     </tr>
    9.         <tr>
    10.         <td><?php echo $value->vendor; ?></td>
    11.     </tr>
    12.         <tr>
    13.         <td><?php echo $value->color; ?></td>
    14.     </tr>
    15.  
    16.     <?php
    17. }
    18. ?>
    19.     </table>
     
    kadet166 нравится это.
  15. antoniii

    antoniii Активный пользователь

    С нами с:
    16 мар 2022
    Сообщения:
    417
    Симпатии:
    71
    Код (Text):
    1. <?xml version="1.0" encoding="windows-1251" standalone="yes"?>
    2.           <shop>
    3.             <offer>
    4.                <price>200</price>
    5.                <vendor>Vendor</vendor>
    6.                <color>RED</color>
    7.              </offer>
    8.             <offer>
    9.                <price>300</price>
    10.                <vendor>Vendor</vendor>
    11.                <color>RED</color>
    12.              </offer>
    13.             <offer>
    14.                <price>100</price>
    15.                <vendor>Vendor</vendor>
    16.                <color>blue</color>
    17.              </offer>
    18.             <offer>
    19.                <price>100</price>
    20.                <vendor>Vendor</vendor>
    21.                <color>green</color>
    22.              </offer>
    23.            </shop>
     
  16. twim32

    twim32 Активный пользователь

    С нами с:
    29 мар 2017
    Сообщения:
    275
    Симпатии:
    58
    ТС спросил как отсортировать массив, я привел аналогию. Если он не может перевести массив в объект, да еще и в лыжах гвозди, то это явно не моя вина.
     
  17. antoniii

    antoniii Активный пользователь

    С нами с:
    16 мар 2022
    Сообщения:
    417
    Симпатии:
    71
    Я Вас понимаю. :)
     
  18. kadet166

    kadet166 Новичок

    С нами с:
    15 мар 2022
    Сообщения:
    13
    Симпатии:
    5
    Я Вас всех прекрасно понимаю :) что для того чтобы код заработал не хватало переменной $value.
    Код (Text):
    1. foreach ($xml->offer as $products=>$value)
    2.   if ( (string) $value->color == "RED" )
    Спасибо за помощь )