За последние 24 часа нас посетили 22845 программистов и 1232 робота. Сейчас ищут 749 программистов ...

Правильно ли я делаю декодирование из JSON в ассоциативный массив?

Тема в разделе "Сделайте за меня", создана пользователем Tajoda, 11 июн 2017.

  1. Tajoda

    Tajoda Новичок

    С нами с:
    11 июн 2017
    Сообщения:
    3
    Симпатии:
    0
    Добрый день.
    У меня такая задача: сделать класс, который будет обрабатывать приходящий со сервера JSON и делать из него необходимую строку. Так как у меня пока нет функционала по приходящему json, то я для примера беру данные json из файла.
    Вопросы у меня такие:
    1) правильно ли я делаю обращение к классу?
    2) работает ли сама функция? если нет, можете подсказать, где у меня ошибка?
    PHP:
    1. <?php
    2. // ниже прмер json, который я беру из файла
    3. /*{
    4. "journal":
    5. {
    6.     "title": "Lobachevskii Journal of Mathematics",
    7.     "issn": "1995-0802"
    8. },
    9. "issue":
    10. {
    11.     "title": "Volume 23",
    12.     "year": "2006"
    13. },
    14. "title": "Maximum Entropy Wave functions",
    15. "authors":
    16. [
    17.     {
    18.         "author": "Per K. Jakobsen"
    19.     },
    20.     {
    21.         "author": "Valentin V. Lychagin"
    22.     }
    23. ],
    24. "file" :
    25. [
    26.     {
    27.         "ext": "DVI",
    28.         "href": "https://lobachevskii-dml.ru/public/collections/ljm/Volume_23/.."
    29.     },
    30.     {
    31.         "ext": "PS", "href": "https://lobachevskii-dml.ru/public/collections/ljm/Volume_23/.."
    32.     },
    33.     {
    34.         "ext": "PDF", "href": "https://lobachevskii-dml.ru/public/collections/ljm/Volume_23/.."
    35.     }
    36. ],
    37. "abstract": "different text.",
    38. "keyword":
    39. [
    40.     "Maximum entropy principle",
    41.     "Quantum mechanics",
    42.     "Wavefunctions",
    43.     "Probability theory",
    44.     "Density matrix"
    45. ],
    46. "msc":
    47. [
    48.     "82B99",
    49.     "81Q99",
    50.     "81P15",
    51.     "94A17"
    52. ]
    53. }*/
    54. class Сitation {
    55.  
    56.     public function createCitationMLA($file){
    57.         $arrParams = json_decode($file, true);
    58.      
    59.         $journalTitle = $arrParams['journal']['title'];
    60.         $journalIssn = $arrParams['journal']['issn'];
    61.         $issueTitle = $arrParams['issue']['title'];
    62.         $issueYear = $arrParams['issue']['year'];
    63.         $title = $arrParams['title'];
    64.         /*foreach ($arrParams['authors'] as $authors){
    65.             $strAuthors .= $authors;
    66.         }
    67.         $arr = array();
    68.         foreach ($arrParams['file'] as $key => $value){
    69.             if (array_key_exists('ext', $value)) {
    70.                 array_push($arr, $value);
    71.             }
    72.         }
    73.         $abstract = $arrParams['abstract'];
    74.         foreach ($arrParams['keyword'] as $keyword){
    75.             $strKeyword .= $keyword;
    76.         }
    77.         foreach ($arrParams['msc'] as $msc){
    78.             $strMsc .= $msc;
    79.         }*/ // если разкомментировать, то все foreach выдают ошибку Invalid argument supplied for foreach()
    80.      
    81.         $strCitation = $journalTitle . ' ' . $journalIssn;
    82.         return $strCitation;
    83.     }
    84.  
    85. }
    86.  
    87.  
    88. $file = file_get_contents('./data.json');
    89. $test = new Сitation();
    90. $main=$test->createCitationMLA($file); // здесь обращаюсь к функции класса
    91. echo 'citation:'. $main; // и хочу вывести возвращаемой значение функции из класса
    Спасибо Вам за любую подсказку или помощь.
     
  2. Алекс8

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

    С нами с:
    18 май 2017
    Сообщения:
    1.730
    Симпатии:
    359
    Если Вам надо получить на выходе это
    Код (Text):
    1. citation:Lobachevskii Journal of Mathematics 1995-0802
    то вроде все в порядке)) работает))
    но в данном контексте можно сделать функцию статической.. создание объекта в данном случае вроде как и не нужно..
     
  3. Tajoda

    Tajoda Новичок

    С нами с:
    11 июн 2017
    Сообщения:
    3
    Симпатии:
    0
    Странно, у меня почему-то выводит только 'citation' а саму строку нет... Значит обращение к функции класса правильное? Если так, то значит где-то я неправильно в функции что-то делаю...
     
  4. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.752
    Симпатии:
    1.322
    Адрес:
    Лень
    81 и 82 заменяем на:
    PHP:
    1. return implode ( ' ', $arrParams['journal'] );
    и удаляя строки нелогичные в таком случае 59 - 60
    --- Добавлено ---
    88 - 90
    PHP:
    1. printf ( 'citation:%s', Сitation::createCitationMLA( file_get_contents ( $_SERVER['DOCUMENT_ROOT'] . '/data.json' ) ) );
     
  5. Tajoda

    Tajoda Новичок

    С нами с:
    11 июн 2017
    Сообщения:
    3
    Симпатии:
    0
    MouseZver, спасибо большое за помощь!
    Изменил указанные строки, функцию изменил на статическую.
    Но, видимо, что-то не так в функции, так как выдает ошибку: implode() [function.implode]: Invalid arguments passed
    Также, если я убираю комментирование в
    PHP:
    1. foreach ($arrParams['authors'] as $authors){
    2.             $strAuthors .= $authors;
    3. }
    то падает ошибка: Invalid argument supplied for foreach()
    Буду разбираться, почему так.
     
  6. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.752
    Симпатии:
    1.322
    Адрес:
    Лень
    смотри что за данные присылаются