Правила     Закладки     Карма    Календарь    Журналы    Помощь    Поиск    PDA    Чат   
        СМС-ки
   
Пейджер выключен!
Страницы: (2) 1 [2]  ( Перейти к первому непрочитанному сообщению )  
Фильтр авторов:    показать 
  скрыть
  Ответ в темуСоздание новой темыСоздание опроса

> парсер yaml, не могу понять как спарсить в многомерный массив
twin  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Глухой нуб
******

Профиль
Группа: Администратор
Почтальон группы
Сообщений: 15559
Пользователь №: 6543
На форуме: 8 лет, 2 месяца, 1 день
Карма: 299

Трезвый :
5 лет, 11 месяцев, 10 дней


Цитата (Invis1ble @ 26.10.2015 - 16:21)
сделали б уже форк, да прошлись в IDE Ctrl+H -> Symfony -> ABC
Я же говорю, он слишком тяжелый и замудреный для учебного фреймворка. Там много лишнего, что нами использоваться не будет. А так мы сейчас его почистим, с другими скрестим и выведем новую породу YAML-light smile.gif

За одно пороемся в разных исхониках.


--------------------
Если вам недостаточно собственных заблуждений, можно расширить их мнениями экспертов.

Нужно уважать мнение оппонета. Ведь заблуждаться - его святое право.

Зачем ворошить старое, когда можно наворотить новое?

user posted image
PMСайт пользователяICQ
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
pamparam  
 ۩  [x] Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Старик
***

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 100
Пользователь №: 29455
На форуме: 5 лет, 3 месяца
Карма: 1




вот что намудрил...
выставляю на всеобщую критику


class Yaml
{
/**
* Очищаем Yaml строки от маркеров и комментариев в начале и в конце
*
*
@param string $value The input YAML string
*
*
@return string A cleaned up YAML string
*/

private function cleanup($value)
{
$value = str_replace([("\r\n", "\r")], "\n", $value);
// очищаем YAML шапку
$value = preg_replace('#^\%YAML[: ][\d\.]+.*\n#u', '', $value);

// удаляем комментарии
$value = preg_replace('#^(\#.*?\n)+#s', '', $value);

// удаляем маркер (---)
$value = preg_replace('#^\-\-\-.*?\n#s', '', $value);

// удаляем маркер (...)
$value = preg_replace('#\.\.\.\s*$#', '', $value);
return $value;
}
/**
* массив из строк Yaml
*
@param $str
*
@return array
*/

public function arrayLine($str)
{

$line = explode("\n", $str);

foreach ($line as $val) {
$yaml_dec[] = preg_replace('#^-#', ' ', $val);
}

//дальше нужно сделать разбор каждой строки
$i = 0;
foreach ($yaml_dec as $val) {
$yaml_array [] = explode(":", $val);

// если значение НЕ пустое
if (!empty($yaml_array[$i][1])) {
$var1[] = $yaml_array[$i][0];
$var2[] = $yaml_array[$i][1];
}
$i++;
}
$yaml = array_combine($var1, $var2);

return $yaml;
}

/**
* получаем одномерный массив
*
@param $str
*
@return array
*/


public function parser($str)
{
// очищаем и делаем массив
$strline = $this->cleanup($str);
return $this->arrayLine($strline);
}
}


из такого yaml


$yaml = <<<EOD
#sdjfhhsdjk
invoice: 34843
date: "2001-01-23"
bill-to: &id001
given: Chris
family: Dumars
address:
city: Royal Oak
state: MI
postal: 48046
ship-to: *id001
product:
- sku: BL394D
quantity: 4
description: Basketball
price: 450
- sku: BL4438H
quantity: 1
description: Super Hoop
price: 2392
tax: 251.420000
total: 4443.520000
comments: Late afternoon is best. Backup contact is Nancy Billsmer @ 338-4338.
...

EOD;


можно получить
такой массив

Array
(
[
invoice] => 34843
[date] => "2001-01-23"
[bill-to] => &id001
[ given] => Chris
[ family] => Dumars
[ city] => Royal Oak
[ state] => MI
[ postal] => 48046
[ship-to] => *id001
[ sku] => BL4438H
[ quantity] => 1
[ description] => Super Hoop
[ price] => 2392
[tax] => 251.420000
[total] => 4443.520000
[comments] => Late afternoon is best. Backup contact is Nancy Billsmer @ 338-4338.
)
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
twin  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Глухой нуб
******

Профиль
Группа: Администратор
Почтальон группы
Сообщений: 15559
Пользователь №: 6543
На форуме: 8 лет, 2 месяца, 1 день
Карма: 299

Трезвый :
5 лет, 11 месяцев, 10 дней


Пробелы в ключах - не самое удачное решение ) И ты половину строк потерял. Где address, где
product? Лучше каждую строку предсавить массивом с указанием числа отступов. И массив нужен простой, не ассоциативный. Вот примерно так для начала

0 => [0, 'invoice: 34843']
1 => [0, 'date: 2001-01-23']
2 => [0, 'bill-to: &id001']
3 => [1, 'given: Chris']


И черточки куда то делись. :) Они важны. Их вместо пробелов нужно указать:
11 => ['-', 'sku: BL4438H']


Такой массив строк потом можно будет разобрать легко.


--------------------
Если вам недостаточно собственных заблуждений, можно расширить их мнениями экспертов.

Нужно уважать мнение оппонета. Ведь заблуждаться - его святое право.

Зачем ворошить старое, когда можно наворотить новое?

user posted image
PMСайт пользователяICQ
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
pamparam  
 ۩  Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Старик
***

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 100
Пользователь №: 29455
На форуме: 5 лет, 3 месяца
Карма: 1




одна голова хорошо а два лучше спс
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
twin  
[x] Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Глухой нуб
******

Профиль
Группа: Администратор
Почтальон группы
Сообщений: 15559
Пользователь №: 6543
На форуме: 8 лет, 2 месяца, 1 день
Карма: 299

Трезвый :
5 лет, 11 месяцев, 10 дней


По самому коду замечания:
    public function arrayLine($str)
{
$line = explode("\n", $str);
$yaml_dec = []; // <--- Инициализация обязательна
$var1 = $var2 = []; // Moжно так, ничего страшного, а лучше так:
$keys = $values = [] // Не нужно абстрактных имен.

foreach ($line as $val) {
$yaml_dec[] = preg_replace('#^-#', ' ', $val);
}

$i = 0;
foreach ($yaml_dec as $val) {
$yaml_array [] = explode(":", $val);

if (!empty($yaml_array[$i][1])) {
$keys[] = $yaml_array[$i][0];
$values[] = $yaml_array[$i][1];
}
$i++;
}
// Перезапись не нужна. Лишняя память.
return array_combine($keys, $values);
}


--------------------
Если вам недостаточно собственных заблуждений, можно расширить их мнениями экспертов.

Нужно уважать мнение оппонета. Ведь заблуждаться - его святое право.

Зачем ворошить старое, когда можно наворотить новое?

user posted image
PMСайт пользователяICQ
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
pamparam  
 ۩  [x] Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Старик
***

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 100
Пользователь №: 29455
На форуме: 5 лет, 3 месяца
Карма: 1




исправленная версия )


class Yaml
{
/**
* Очищаем Yaml строки от маркеров и комментариев в начале и в конце
*
*
@param string $value The input YAML string
*
*
@return string A cleaned up YAML string
*/

private function cleanup($value)
{
$value = str_replace(["\r\n", "\r"], "\n", $value);
// очищаем YAML шапку
$value = preg_replace('#^\%YAML[: ][\d\.]+.*\n#u', '', $value);

// удаляем комментарии
$value = preg_replace('#^(\#.*?\n)+#s', '', $value);

// удаляем маркер (---)
$value = preg_replace('#^\-\-\-.*?\n#s', '', $value);

// удаляем маркер (...)
$value = preg_replace('#\.\.\.\s*$#', '', $value);
return $value;
}
/**
* массив из строк Yaml
*
@param $str
*
@return array
*/

public function arrayLine($str)
{

$line = explode("\n", $str);

foreach ($line as $value) {
if (!empty($value)) {
$count_slash = strspn($value, ' ');

if (preg_match('#^-#', $value)) {

$count_slash = '-';
$value = preg_replace('#^-#', ' ', $value);

}
$yaml[] = [$count_slash, trim($value)];
}

}


return $yaml;
}

/**
* получаем одномерный массив
*
@param $str
*
@return array
*/


public function parser($str)
{
// очищаем и делаем массив
$strline = $this->cleanup($str);
return $this->arrayLine($strline);
}
}

PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
twin  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Глухой нуб
******

Профиль
Группа: Администратор
Почтальон группы
Сообщений: 15559
Пользователь №: 6543
На форуме: 8 лет, 2 месяца, 1 день
Карма: 299

Трезвый :
5 лет, 11 месяцев, 10 дней


Начало хорошее. Но не все гладко.

1. На всякий случай замени табуляцию на 4 пробела.
2. Перед черточками тоже могут быть пробелы. Это неспроста. smile.gif Это часть разметки.

Наверное нужно добавить в массив третий параметр. Пусть так будет:
0 => [0, false, 'invoice: 34843']
11 => [0, true, 'sku: BL4438H']

Ну а в основном уже вырисовывается картинка. smile.gif


--------------------
Если вам недостаточно собственных заблуждений, можно расширить их мнениями экспертов.

Нужно уважать мнение оппонета. Ведь заблуждаться - его святое право.

Зачем ворошить старое, когда можно наворотить новое?

user posted image
PMСайт пользователяICQ
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
pamparam  
 ۩  Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Старик
***

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 100
Пользователь №: 29455
На форуме: 5 лет, 3 месяца
Карма: 1




что то я не пон.
третий параметр это что?
что туда пихать?
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
twin  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Глухой нуб
******

Профиль
Группа: Администратор
Почтальон группы
Сообщений: 15559
Пользователь №: 6543
На форуме: 8 лет, 2 месяца, 1 день
Карма: 299

Трезвый :
5 лет, 11 месяцев, 10 дней


Не третим, а вторым. true, если есть черточка и false если нет


--------------------
Если вам недостаточно собственных заблуждений, можно расширить их мнениями экспертов.

Нужно уважать мнение оппонета. Ведь заблуждаться - его святое право.

Зачем ворошить старое, когда можно наворотить новое?

user posted image
PMСайт пользователяICQ
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
pamparam  
 ۩  [x] Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Старик
***

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 100
Пользователь №: 29455
На форуме: 5 лет, 3 месяца
Карма: 1




немного обновил

сделал отлов табов и в массив добавил дефисы

class Yaml
{
/**
* Очищаем Yaml строки от маркеров и комментариев в начале и в конце
*
*
@param string $value The input YAML string
*
*
@return string A cleaned up YAML string
*/

private function cleanup($value)
{
$value = str_replace(["\r\n", "\r"], "\n", $value);
// очищаем YAML шапку
$value = preg_replace('#^\%YAML[: ][\d\.]+.*\n#u', '', $value);

// удаляем комментарии
$value = preg_replace('#^(\#.*?\n)+#s', '', $value);

// удаляем маркер (---)
$value = preg_replace('#^\-\-\-.*?\n#s', '', $value);

// удаляем маркер (...)
$value = preg_replace('#\.\.\.\s*$#', '', $value);
return $value;
}
/**
* массив из строк Yaml
*
@param $str
*
@return array
*/

public function arrayLine($str)
{

$line = explode("\n", $str);
$space = 'false';

foreach ($line as $value) {
if (!empty($value)) {
// отлавливаем табуляцию
if (preg_match('#[\t]+#', $value)) {
throw new \Exception("Синтаксис Yaml не поддерживает табуляцию");
}
// считаем пробелы в строке
$count_space = strspn($value, ' ');

// ищим дефис в строке
if (preg_match('#^-#', $value)) {
$value = preg_replace('#^-#', ' ', $value);
$space = 'true';
}
// записываем массив
$yaml[] = [$count_space, $space, trim($value)];
}
}


return $yaml;
}

/**
* получаем одномерный массив
*
@param $str
*
@return array
*/


public function parser($str)
{
// очищаем и делаем массив
$strline = $this->cleanup($str);
return $this->arrayLine($strline);
}
}



PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
  Быстрый ответ
Информация о Госте
Введите Ваше имя
Кнопки кодов
Для вставки цитаты, выделите нужный текст и
НАЖМИТЕ СЮДА
Введите сообщение
Смайлики
:huh:  :o  ;) 
:P  :D  :lol: 
B)  :rolleyes:  <_< 
:)  :angry:  :( 
:unsure:  :blink:  :ph34r: 
     
Показать всё

Опции сообщения  Включить смайлики?
 Включить подпись?
 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:

Опции темыСтраницы: (2) 1 [2]  Ответ в темуСоздание новой темыСоздание опроса