Преобразование yaml в json - нужен совет.

ЕСТЬ РЕШЕНИЕ InstantCMS 1.X
#1 23 января 2017 в 13:33
Здравствуйте.
Есть таблица в БД
  1. id | some_key | title | description | files
Я беру из неё строки по заданному ключу some_key, и формирую json
  1.  
  2. function getStroki($some_key){
  3. $sql = "SELECT *
  4. FROM cms_some_table
  5. WHERE some_key='{$some_key}'";
  6. $result = $inDB->query($sql) ;
  7. if ($inDB->num_rows($result)){
  8. while($item = $inDB->fetch_assoc($result)){
  9. $massiv[] = $item;
  10. }
  11. }
  12. return $massiv;
  13. } // взяли массив
  14. $json_mass = json_encode(getStroki($some_key)); // сделали json
  15.  
И всё хорошо))) одно только плохо — в поле files лежат данные, упакованные с помощью YAML (т.е., несколько переменных в одной ячейке). И естественно, json из них не формируется, так как для начала yaml надо разобрать в отдельный массив, который будет вложенным в основной. В инстанте для этого предусмотрено yamlToArray, но как это сделать внутри функции getStroki — ума не приложу.
Помогите, пожалуйста, коллеги!
#2 23 января 2017 в 13:44
$somearray = cmsCore::yamlToArray('чего_запихиваем_в_массив');

Тоже не заметил, что про первую ветку...
#3 23 января 2017 в 13:47
Строку id | some_key | title | description | files преобразовать в массив
  1. $array = cmsModel::yamlToArray($str);
потом передаете в шаблон в json формате
  1. $this->cms_template->renderJSON($array);
* Это если вы передаете из контроллера в шаблон

Не заметил что тема про 1 ветку
#4 23 января 2017 в 14:08
Ris, Evanescence, я поясню

У меня должен получиться вот такой json
  1.  
  2. {
  3. 'title': 'Первый заголовок',
  4. 'description': 'Первое описание',
  5. 'files': ['Файл 1-1.jpg', 'Файл 1-2.jpg', 'и тд', 'и тд']
  6. },
  7. {
  8. 'title': 'Второй заголовок',
  9. 'description': 'Второе описание',
  10. 'files': ['Файл 2-1.jpg', 'Файл 2-2.jpg', 'и тд', 'и тд']
  11. }
  12.  
а получается же
  1.  
  2. {
  3. 'title': 'Первый заголовок',
  4. 'description': 'Первое описание',
  5. 'files': ['чёртичто']
  6. },
  7. {
  8. 'title': 'Второй заголовок',
  9. 'description': 'Второе описание',
  10. 'files': ['чёртичто']
  11. }
  12.  
из-за того, что в поле files лежат данные yaml

То есть, json-то сам формируется, но как мне распарсить yaml, чтобы вместо 'чёртичто' получилось 'Файл 2-1.jpg', 'Файл 2-2.jpg', 'и тд', 'и тд' ?

Надо как-то взять из массива $massiv[номер итерации]['files'], сделать наверно так
  1.  
  2. $xxx = cmsCore::yamlToArray($massiv[номер итерации]['files']);
  3. $massiv[номер итерации]['files'] = $xxx; // обратно присвоить распарсенное значение элементу files основного массива
  4.  
Я так попробовал, но вместо чёртичто появляется теперь другое чёртичто...

Что я не так делаю? Глаза замылились, нужен свежий взгляд…
#5 23 января 2017 в 15:11
Все, пока задавал вопрос, и пытался объяснить, так и сам понял))) переписал цикл так
  1.  
  2. $i = 0;
  3. while($item = $inDB->fetch_assoc($result)){
  4. $massiv[] = $item;
  5. $file = cmsCore::yamlToArray($massiv[$i]['files']);
  6. // а теперь главное переработать массив же!!! вот я Семён Семёныч
  7. foreach($file as $key=>$value) {
  8. $a[] = $key; // пишем значения в новый массив
  9. }
  10. $massiv[$i]['files'] = $a; // и присвоим старому массиву значения из нового массива
  11. unset($a); // а потом новый массив удалим, чтоб не мешался
  12. $i++; // счётчик клац-клац
  13. }
  14.  
#6 23 января 2017 в 16:44
Олегсей, не удержался, открыл вам тему заново, ибо с самого начала не стоит лепить г-код.

  1. function get_items($some_key){ // Учитесь сразу называть функции нормальными именами, без транслитезации, ибо колхоз
  2. $items = array(); // массив в данном случае нужно определить, т.к. записей может не быть и получите нотис
  3. $sql = "SELECT *
  4. FROM cms_some_table
  5. WHERE some_key='{$some_key}'";
  6. $result = $inDB->query($sql) ;
  7. if ($inDB->num_rows($result)){
  8. while($item = $inDB->fetch_assoc($result)){
  9. $item['files'] = cmsCore::yamlToArray($item['files']);
  10. $items[] = $item;
  11. }
  12. }
  13. return $items;
  14. }
#7 23 января 2017 в 22:42

не стоит лепить г-код

Fuze
Это был китайский стиль, бессмысленный и беспощадный)) писалось на скорую руку, для того, чтобы клиент посмотрел, что получится в итоге.
Проект утверждён, всё уже переписывается в соответствии со стандартами. Не стоит беспокоиться. Но всё равно, спасибо.

А если серьезно — насчёт транслитерации названий переменных и функций — в корне не согласен. Колхоз — это $jhpA_55g, имхо, конечно. А к примеру, у итальянцев видел функцию ricArticolo вместо getArticle, или css-класс titolo вместо header. Так почему русским нельзя?
#8 23 января 2017 в 23:00

А если серьезно — насчёт транслитерации названий переменных и функций — в корне не согласен.

Олегсей
Ну моё дело посоветовать, как делать правильно. А там дальше сами smile

Колхоз — это $jhpA_55g

Олегсей
Это идиотизм или обфускация joke

Так почему русским нельзя?

Олегсей
Ровняться нужно на стандарты и общепринятые принципы. А так, конечно, никто не запрещает писать с подворотом, главное, чтобы синтаксис соблюдался.
#9 24 января 2017 в 08:28
Fuze, кстати, случайно вчера нарыл govnokod.ru, читал, много думал rofl

Еще раз спасибо, кроме шуток. К советам опытных людей всегда прислушиваюсь.
Вы не можете отвечать в этой теме.
Войдите или зарегистрируйтесь, чтобы писать на форуме.
Используя этот сайт, вы соглашаетесь с тем, что мы используем файлы cookie.