Форум программистов, компьютерный форум, киберфорум
PHP для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
14 / 9 / 13
Регистрация: 10.09.2012
Сообщений: 1,117

Мвссив для Yaml

01.12.2021, 23:14. Показов 864. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Привет всем. Мне нужно записать данные в таблицу(Mysql) в формате yaml, что бы было как то так
HTML5
1
2
3
4
5
6
9:
-name1
-name2
10:
-name1
-name2
Для записи в базу массива в yaml метод есть. Нужна помощь с массивом. Массив получаю от клиента. Вид такой
HTML5
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
Array (
 [0] =>
 Array (
 [id] => 9 
[name] => photo 
) 
[1] => 
Array ( 
[id] => 9 
[name] => for_photos 
)
 [2] =>
 Array (
 [id] => 10 
[name] => photo 
) 
[3] => 
Array (
 [id] => 10
 [name] => teaser 
) 
)
Как мне превратить этот массив во что то похожее для записи в базу?
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
01.12.2021, 23:14
Ответы с готовыми решениями:

Запрос для поля yaml
Привет. Mysql. В текстовом поле данные в формате yaml. --- "Chapter 45:2021-08-21": - 2.jpeg - 3.jpeg - 4.jpeg - 5.jpeg...

php и YAML.Вывод в формате YAML. Не выходит пропарсить текст.
Доброго времени суток вск форумчанам. хочу пропарсить текст,но возникает проблема.страница вылетает с ошибкой. парсить нужно без стороних...

Yaml для тестов
сап собственно кто то юзал yaml для инициализации бд в тестах ? если можно примерчик что ли :(

8
3 / 2 / 2
Регистрация: 14.03.2015
Сообщений: 168
01.12.2021, 23:44
юрьич,

serialize
0
14 / 9 / 13
Регистрация: 10.09.2012
Сообщений: 1,117
01.12.2021, 23:49  [ТС]
Методом проб получил вид нужного массива.
PHP
1
2
3
4
5
6
7
8
9
10
11
            $options = array(
                array(
                  'id'=> 9,
                  'name'=>array('photo','for_photos'),
                ),
                array(
                   'id'=> 10,
                   'name'=>array('photo','teaser')
                )
 
            );
Подскажите,как исходный превратить в такой?

Добавлено через 3 минуты
Aplikman, мне нужен массив. Далее там всё ок).
0
3 / 2 / 2
Регистрация: 14.03.2015
Сообщений: 168
02.12.2021, 00:10
юрьич, то что вы показали выше в первом посте - это результат вывода функции print_r()

Вам нужно изменить массив на свою структуру? Это делается разными способами, смотря какая конкретно структура вам нужна.
Вам нужно только сохранить массив в БД? Ответ вам дал во втором посте. Функции serialize все равно какой у вас вид массива, она превращает массив в строку, которую потом можно сохранить в БД. Обратно из строки получить массив - unserialize

Добавлено через 16 минут
Если у вас задача заключается в том, чтобы перевести обратно результат вывода print_r() в php массив, то у вас плохая задача. Потому что для таких задач есть, к примеру, JSON.

Но все же если вам очень хочется, то можно вот так:
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
<?php
 
$str = "Array (
 [0] =>
 Array (
 [id] => 9 
[name] => photo 
) 
[1] => 
Array ( 
[id] => 9 
[name] => for_photos 
)
 [2] =>
 Array (
 [id] => 10 
[name] => photo 
) 
[3] => 
Array (
 [id] => 10
 [name] => teaser 
) 
)";
 
print_r(print_r_reverse($str));
 
function print_r_reverse($in) {
    $lines = explode("\n", trim($in));
    if (trim($lines[0]) != 'Array') {
        // bottomed out to something that isn't an array
        return $in;
    } else {
        // this is an array, lets parse it
        if (preg_match("/(\s{5,})\(/", $lines[1], $match)) {
            // this is a tested array/recursive call to this function
            // take a set of spaces off the beginning
            $spaces = $match[1];
            $spaces_length = strlen($spaces);
            $lines_total = count($lines);
            for ($i = 0; $i < $lines_total; $i++) {
                if (substr($lines[$i], 0, $spaces_length) == $spaces) {
                    $lines[$i] = substr($lines[$i], $spaces_length);
                }
            }
        }
        array_shift($lines); // Array
        array_shift($lines); // (
        array_pop($lines); // )
        $in = implode("\n", $lines);
        // make sure we only match stuff with 4 preceding spaces (stuff for this array and not a nested one)
        preg_match_all("/^\s{4}\[(.+?)\] \=\> /m", $in, $matches, PREG_OFFSET_CAPTURE | PREG_SET_ORDER);
        $pos = array();
        $previous_key = '';
        $in_length = strlen($in);
        // store the following in $pos:
        // array with key = key of the parsed array's item
        // value = array(start position in $in, $end position in $in)
        foreach ($matches as $match) {
            $key = $match[1][0];
            $start = $match[0][1] + strlen($match[0][0]);
            $pos[$key] = array($start, $in_length);
            if ($previous_key != '') $pos[$previous_key][1] = $match[0][1] - 1;
            $previous_key = $key;
        }
        $ret = array();
        foreach ($pos as $key => $where) {
            // recursively see if the parsed out value is an array too
            $ret[$key] = print_r_reverse(substr($in, $where[0], $where[1] - $where[0]));
        }
        return $ret;
    }
}
Результат:
Code
1
Array ( [0] => Array ( [id] => 9 [name] => photo ) [1] => Array ( [id] => 9 [name] => for_photos ) [2] => Array ( [id] => 10 [name] => photo ) [3] => Array ( [id] => 10 [name] => teaser ) )
0
14 / 9 / 13
Регистрация: 10.09.2012
Сообщений: 1,117
02.12.2021, 08:09  [ТС]
Цитата Сообщение от Aplikman Посмотреть сообщение
Если у вас задача заключается в том, чтобы перевести обратно результат вывода print_r() в php массив
Нет у меня такой задачи. Я же написал,что мне нужно из такого
HTML5
1
Array ( [0] => Array ( [id] => 5 [name] => kind ) [1] => Array ( [id] => 5 [name] => source ) [2] => Array ( [id] => 9 [name] => for_photo ) [3] => Array ( [id] => 9 [name] => photo ) )
получить такой
HTML5
1
Array ( [0] => Array ( [id] => 5 [name] => Array ( [0] => kind [1] => source ) ) [1] => Array ( [id] => 9 [name] => Array ( [0] => for_photo [1] =>  photo ) )
Цитата Сообщение от Aplikman Посмотреть сообщение
юрьич, то что вы показали выше в первом посте - это результат вывода функции print_r()
Конечно да. Так как по другому я показать не могу,так как получаю через аякс от клиента.
0
Невнимательный
 Аватар для ft4l
2837 / 1262 / 358
Регистрация: 08.02.2013
Сообщений: 7,350
Записей в блоге: 2
02.12.2021, 09:20
Лучший ответ Сообщение было отмечено юрьич как решение

Решение

Цитата Сообщение от юрьич Посмотреть сообщение
print_r()
var_export() для copypaste заметно удобнее было-бы )

А так попарное чтение наверно, если массив упорядочен и и именно по парам.
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
$Arr =[
    ['id'=> 9, 'name' => 'photo'],  
    ['id'=> 9, 'name' => 'for_photos'],  
    ['id'=> 10, 'name' => 'photo'],  
    ['id'=> 10, 'name' => 'teaser'],  
];
$out = [];
while(($a=pos($Arr)) && $b=next($Arr)){
    if($a['id'] != $b['id']){
        trigger_error('Something wrong');
        $out = false;
        break;
    }
    $out[] = ['id'=>$a['id'], 'name' => [$a['name'], $b['name']]];
    next($Arr);
}
reset($Arr);
 
var_export($out);
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
array (
  0 =>
  array (
    'id' => 9,
    'name' =>
    array (
      0 => 'photo',
      1 => 'for_photos',
    ),
  ),
  1 =>
  array (
    'id' => 10,
    'name' =>
    array (
      0 => 'photo',
      1 => 'teaser',
    ),
  ),
)
1
14 / 9 / 13
Регистрация: 10.09.2012
Сообщений: 1,117
02.12.2021, 10:14  [ТС]
ft4l, да,всё так. Спасибо. И за напоминание о var_export()
0
Невнимательный
 Аватар для ft4l
2837 / 1262 / 358
Регистрация: 08.02.2013
Сообщений: 7,350
Записей в блоге: 2
02.12.2021, 11:07
Цитата Сообщение от ft4l Посмотреть сообщение
упорядочен и и именно по парам
юрьич, если не упорядочен можно тоже.
Но иногда удобнее упростить , и на выходе получать что-то типа
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
$out = [];
foreach($Arr as $a){
    if (!isset($out[$a['id']])) $out[$a['id']] = [];
    $out[$a['id']][] = $a['name'];
}
/*
array (
  9 =>
  array (
    0 => 'photo',
    1 => 'for_photos',
  ),
  10 =>
  array (
    0 => 'photo',
    1 => 'teaser',
  ),
)
*/
Если таким-же способом получать такой массив, как задумано,
то реально усложняется
PHP
1
2
3
4
5
6
7
8
9
10
11
12
function get_i($ar, $id) {
    foreach($ar As $k=>$el){
        if ($el['id'] == $id) return $k;
    }
    return NULL;
}
$out = [];
foreach($Arr as $a){
    $key = get_i($out, $a['id']);
    if (is_null($key)) $out[] = ['id'=>$a['id'], 'name'=>[$a['name']]];
    else $out[$key]['name'][] = $a['name'];
}
Добавлено через 10 минут
Цитата Сообщение от ft4l Посмотреть сообщение
return NULL; // или 0 если не бывает id==0
коментарий удалил ) -1 только если и проверка >=0
0
14 / 9 / 13
Регистрация: 10.09.2012
Сообщений: 1,117
02.12.2021, 20:45  [ТС]
Спасибо.Как раз хотел написать, что с тремя name не работает). Теперь всё в ажуре. Сам бы я до ишачей пасхи возился. Что то плохо массивы даются.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
02.12.2021, 20:45
Помогаю со студенческими работами здесь

Создание генератора текста для yaml
Здравствуйте, человеки. На форум зашел с 1 единственным вопросом: Как сделать так, чтобы при нажатии на кнопку добавлялся текст в...

Есть ли в .NET средства для парсинга YAML файлов
Интересует есть ли у NET средства для парсинга YAML файлов? Искал, но нашел только китайскую наработку какую то и все.

Сортировка Yaml
Привет. Имею такой Yaml --- - 1 2021-08-15 - 2 2021-08-12 - 3 2021-08-14 - 4 2021-08-15 - 5 2021-08-13 - 6 2021-08-15 После...

Yaml-cpp
Можете подробно рассказать что это такое?

Delphi и YAML
Народ, не подскажете, есть ли компонент или класс для работы с YAML? А то писать самому класс в лом


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru