Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: Парсинг json
Форумы портала PHP.SU » PHP » Напишите за меня, пожалуйста » Парсинг json

Страниц (1): [1]
 

1. yaroslav.chernicov77 - 14 Июля, 2020 - 12:10:46 - перейти к сообщению
Дорогие друзья помогите пожалуйста решить задачу.

Есть верстка таблицы (от неё отходить нельзя).
Есть компонент, к примеру catalog.section.list который отработал и создал массив arResult (это терминология bitrix, хотя само задание к битрикс особо не имеет прямого отношения). Вот данный массив:
http://om-sv[dot]ru/progtest/arData[dot]txt
Закодированный в json - сперва надо его считать из файла и раскодировать.

В этом массиве производители косметики. Необходимо вывести данных производителей в алфавитном порядке в таблицу с выделением первой буквы.
Таблица должна состоять строго из 3х столбцов в которых должно быть примерно равное кол-во строк (за исключением последнего столбца).

Вот какой HTML должен получиться в итоге:
http://om-sv[dot]ru/progtest/table[dot]html

В чем возникла моя проблема как новичка.

Я использовал такой список функций


$json = file_get_contents($json); // Взял данные из файла

$obj = json_decode($json); // Декодировал


print $obj->{"NAME"}; // Пытаюсь вывести все названия товаров

Результата 0 причина не очень понятна

Можете растолковать новичку и объяснить в чем причина?
(Добавление)
Я заметил что json_decode декодирует только определенный формат

Например
CODE (htmlphp):
скопировать код в буфер обмена
  1. {"NAME" :  "Ardell"}


А в предоставленном фале идет формат


CODE (htmlphp):
скопировать код в буфер обмена
  1. ["NAME"]=> string(6) "Ardell"


А такой формат он не обрабатывает.

Какое решение данного вопроса, только преобразовать формат из первого во второй путем разных манипуляций по замене одних символов на другие?
2. Мелкий - 14 Июля, 2020 - 12:44:37 - перейти к сообщению
yaroslav.chernicov77 пишет:
А в предоставленном фале идет формат

А теперь откройте файл и покажите там такое.
Там нормальный JSON "NAME":"Ardell","~NAME":"Ardell"

yaroslav.chernicov77 пишет:
Я заметил что json_decode декодирует только определенный формат

Разумеется. json_decode предназначен декодировать корректный JSON.

yaroslav.chernicov77 пишет:
print $obj->{"NAME"}; // Пытаюсь вывести все названия товаров

Результата 0 причина не очень понятна

Рассматриваете структуру вашего JSON, потом достаёте данные по нужному пути. Почему вы решили, что у вас на верхнем уровне объект? Это верно, но почему вы так решили? Почему вы решили, что у объекта верхнего уровня есть свойство NAME? Почему вы решили, что в нём будут "все названия товаров"?
3. yaroslav.chernicov77 - 14 Июля, 2020 - 14:00:18 - перейти к сообщению
Мелкий пишет:
yaroslav.chernicov77 пишет:
А в предоставленном фале идет формат

А теперь откройте файл и покажите там такое.
Там нормальный JSON "NAME":"Ardell","~NAME":"Ardell"

yaroslav.chernicov77 пишет:
Я заметил что json_decode декодирует только определенный формат

Разумеется. json_decode предназначен декодировать корректный JSON.

yaroslav.chernicov77 пишет:
print $obj->{"NAME"}; // Пытаюсь вывести все названия товаров

Результата 0 причина не очень понятна

Рассматриваете структуру вашего JSON, потом достаёте данные по нужному пути. Почему вы решили, что у вас на верхнем уровне объект? Это верно, но почему вы так решили? Почему вы решили, что у объекта верхнего уровня есть свойство NAME? Почему вы решили, что в нём будут "все названия товаров"?



В целом ответ нашел сделал вывод и категоризированем по буквам как показано в примере мне получилось

Осталось только последний пункт, а именно нужно все расставить в таблице с 3 строками с примерно равным количеством значений.

Так вот тут я использую цикл foreach причем 2 уровненный чтобы вывести отсортированные и сгруппированые названия товаров.

Так вот тут я уже не как не могу придумать идею как сделать чтобы цыклы выводили 3 столбца с равными по размеру значениями?
(Добавление)
Вообщем сделал код и выкладываю в паблик чтобы другие у кого будет такая же задача могли бы быстро её решить

PHP:
скопировать код в буфер обмена
  1. <?
  2.  
  3.  
  4. $json= 'http://om-sv.ru/progtest/arData.txt'; // Указываю путь на файл
  5.  
  6.  
  7.  
  8. $json = file_get_contents($json); // Беру данные из файла
  9.  
  10. //$json = '{"NAME":"LA MENTE"}';
  11.  
  12. $obj = json_decode($json, true); // Декодирую
  13.  
  14. //var_dump($obj);
  15.  
  16. //print $obj->{"SECTIONS"}->{"NAME"}; // Вывожу на экран
  17.  
  18. //echo $obj;
  19.  
  20. //foreach ($obj[SECTIONS][1] as $key => $value) {
  21. //echo "<b>$value $key</b><br>";
  22. //}
  23.  
  24. //echo  $obj[SECTIONS][5][NAME];
  25.  
  26. $mass=  count($obj[SECTIONS]);
  27.  
  28.  
  29. for ($x=1; $x<=$mass; $x++)
  30.         //echo $obj[SECTIONS][$x][NAME].'<br>';
  31.  
  32.         $NameMass[$x] = $obj[SECTIONS][$x][NAME];
  33.        
  34.  
  35.  
  36.  
  37. sort($NameMass, SORT_STRING);
  38.        
  39. $NameMass = array_diff($NameMass, array(''));
  40.  
  41.  
  42.  
  43.  
  44.  
  45. for ($x=15; $x<=33; $x++)
  46.         $NameMass1[$x] = $NameMass[$x];
  47.        
  48.  
  49.        
  50. $NameMass1 = array_diff($NameMass1, array(''));
  51.  
  52.  
  53.  
  54.        
  55.        
  56. for ($x=34; $x<=48; $x++)
  57.         $NameMass2[$x] = $NameMass[$x];
  58.  
  59.  
  60. $NameMass2 = array_diff($NameMass2, array(''));
  61.  
  62.  
  63.  
  64.  
  65.  
  66. for ($x=49; $x<=63; $x++)
  67.         $NameMass3[$x] = $NameMass[$x];
  68.  
  69. $NameMass3 = array_diff($NameMass3, array(''));
  70. echo '<table>';
  71.         echo '<tr>';
  72.  
  73.  
  74.  
  75. /// 1 Столбец
  76. echo '<td>';
  77.  
  78.    
  79.     # Сортируем по алфавиту
  80.    asort($NameMass1);
  81.        
  82.        
  83.    
  84.     # Формируем массив разбитый на категории
  85.    sorting($NameMass1);
  86.        
  87.        
  88.    
  89.     # Выводим
  90.    foreach( $NameMass1 as $key=>$items )
  91.     {
  92.         # Выводим букву раздела
  93.        echo "<br><h3>".mb_strtoupper( $key, 'utf-8' ) . "</h3><br><br>";
  94.        
  95.         # Выводим значения
  96.        foreach( $items as $value )
  97.         {
  98.             echo '<b>'.$value . "</b><br>";
  99.         }
  100.     }
  101.                
  102.        
  103.        
  104.        
  105.        
  106. echo '</td>';  
  107. /// 1 Столбец
  108.  
  109.  
  110.  
  111.  
  112.  
  113.  
  114.  
  115.  
  116. /// 2 Столбец
  117. echo '<td>';
  118.  
  119.    
  120.     # Сортируем по алфавиту
  121.    asort($NameMass2);
  122.        
  123.        
  124.    
  125.     # Формируем массив разбитый на категории
  126.    sorting($NameMass2);
  127.        
  128.        
  129.    
  130.     # Выводим
  131.    foreach( $NameMass2 as $key=>$items )
  132.     {
  133.         # Выводим букву раздела
  134.        echo "<br><h3>".mb_strtoupper( $key, 'utf-8' ) . "</h3><br><br>";
  135.        
  136.         # Выводим значения
  137.        foreach( $items as $value )
  138.         {
  139.             echo '<b>'.$value . "</b><br>";
  140.         }
  141.     }
  142.                
  143.        
  144.        
  145.        
  146.        
  147. echo '</td>';  
  148. /// 2 Столбец  
  149.  
  150.  
  151.  
  152.  
  153.  
  154. /// 3 Столбец
  155. echo '<td>';
  156.  
  157.    
  158.     # Сортируем по алфавиту
  159.    asort($NameMass3);
  160.        
  161.        
  162.    
  163.     # Формируем массив разбитый на категории
  164.    sorting($NameMass3);
  165.        
  166.        
  167.    
  168.     # Выводим
  169.    foreach( $NameMass3 as $key=>$items )
  170.     {
  171.         # Выводим букву раздела
  172.        echo "<br><h3>".mb_strtoupper( $key, 'utf-8' ) . "</h3><br><br>";
  173.        
  174.         # Выводим значения
  175.        foreach( $items as $value )
  176.         {
  177.             echo '<b>'.$value . "</b><br>";
  178.         }
  179.     }
  180.                
  181.        
  182.        
  183.        
  184.        
  185. echo '</td>';  
  186. /// 3 Столбец  
  187.  
  188.        
  189.  
  190.  
  191.                 echo '</tr>';
  192. echo '</table>';
  193.  
  194.  
  195.  
  196.  
  197.        
  198. function sorting( & $array )
  199.     {
  200.         # "Память"
  201.        $memory = NULL;
  202.        
  203.         # Новый массив
  204.        $sorting = array();
  205.        
  206.         # Обходим массив
  207.        foreach( $array as $item )
  208.         {
  209.             # Получаем первую букву
  210.            $letter = mb_substr( $item, 0, 1, 'utf-8' );
  211.            
  212.             # Если текущая буква не равна предыдущей
  213.            if( $letter != $memory )
  214.             {
  215.                 # Заносим букву в "память"
  216.                $memory = $letter;
  217.                
  218.                 # Добавляем новый массив
  219.                $sorting[$memory] = array();
  220.             }
  221.            
  222.             # Дополняем массив
  223.            $sorting[$memory][] = $item;
  224.         }
  225.        
  226.         # Назвачаем массив
  227.        $array = $sorting;
  228.     }  
  229.        
  230.        
  231.        
  232.        
  233.  
  234.  
  235.        
  236.        
  237.  
  238. /*
  239. $json= 'arData.json';
  240.  
  241.  
  242. $sData= file_get_contents($json); // Качаем файл каталог
  243.  
  244.  
  245. //var_dump(json_decode($sData));
  246.  
  247.  
  248. $obj = json_decode($sData,true);
  249.  
  250. $title_one = $obj['response']['items'][0]['title_one'];
  251.  
  252. echo $title_one;
  253.  
  254. */
  255. ?>
  256.  
  257.  
  258.  
  259.  
  260. <!--
  261. <table>
  262.   <tr>
  263.     <td>1</td><td>2</td><td>3</td>
  264.   </tr>
  265.  
  266.   <tr>
  267.     <td>4</td><td>5</td><td>6</td>
  268.   </tr>
  269.  
  270.   <tr>
  271.     <td>7</td><td>8</td><td>9</td>
  272.   </tr>
  273. </table>
  274.  
  275.  
  276.  
  277.  
  278.  
  279.  
  280.  
4. Vladimir Kheifets - 14 Июля, 2020 - 16:33:34 - перейти к сообщению
yaroslav.chernicov77 пишет:


В целом ответ нашел сделал вывод и категоризированем по буквам как показано в примере мне получилось

Осталось только последний пункт, а именно нужно все расставить в таблице с 3 строками с примерно равным количеством значений.

Так вот тут я использую цикл foreach причем 2 уровненный чтобы вывести отсортированные и сгруппированые названия товаров.

Так вот тут я уже не как не могу придумать идею как сделать чтобы цыклы выводили 3 столбца с равными по размеру значениями?
(Добавление)
Вообщем сделал код и выкладываю в паблик чтобы другие у кого будет такая же задача могли бы быстро её решить

Спойлер (Отобразить)

Добрый день!
Это не понятно
Цитата:
Так вот тут я уже не как не могу придумать идею как сделать чтобы цыклы выводили 3 столбца с равными по размеру значениями?
По тому что Вы показали несколько советов.
Используйте CSS и тэги <div>.
Вертикальные отступы лучше не задавать тэгами<br> (которых у Вас немерено),
а горизонтальные пробелами.
Лучше описывать свойствa margin и padding в CSS.
Между прочим, <br><br> работают как один <br>.
Например:
PHP:
скопировать код в буфер обмена
  1. //вместо
  2. echo "<br><h3>".mb_strtoupper( $key, 'utf-8' ) . "</h3><br><br>";
  3.  
  4. //Лучше  определить для тэга <h3> свойствa margin в CSS и написать,
  5. echo "<h3>".mb_strtoupper( $key, 'utf-8' ) . "</h3>";
  6.  
  7. //вместо
  8. # Выводим значения
  9. foreach( $items as $value )
  10. {
  11.       echo '<b>'.$value . "</b><br>";
  12. }
  13.  
  14. //Лучше   определить в CSS свойство  font-weight для тэга <div>  и написать,
  15. foreach( $items as $value )
  16. {
  17.       echo '<div>'.$value . "</div>";
  18. }

Обратите внимание на CSS свойства display и float. Если жизнь заставить переделывать разметку на разные размеры экранов,
<table> придётся убирать и м.б. поэтому лучше вообще не использовать.
Удачи!

 

Powered by ExBB FM 1.0 RC1