Структура JSON изменена, методы ломаются - PullRequest
0 голосов
/ 09 июля 2019

В настоящее время в моей базе данных хранится ниже JSON:

{
    "1": [
        {
            "row": "My name is Trevor"
        }
    ],
    "2": [
        {
            "row": "Hey there! Some other text."
        }
    ],
    "3": [
        {
            "row": "And more."
        }
    ]
}

Теперь используемый мной сторонний API изменил формат вывода на:

[
   {
      "0":"My name is Trevor"
   },
   {
      "0":"Hey there! Some other text."
   },
   {
      "0":"And more."
   }
]

Iиметь функцию PHP, которая читает столбцы, похожие на массивы, и преобразует каждый столбец / строку.Я могу назвать это следующим образом:

public function apply(array $table) : array
{
    return $this->applyRule($table);
}

Который вызывает это:

public function applyRule(array $table): array
{
    $out = [];
    foreach ($table as $col => $rows) {
            $out[$col] = array_map([$this, 'rule'], $rows);
    }

    return $out;
}

Который в конечном счете вызывает правило синтаксического анализа, например:

public function rule($content) : array
{
    return preg_replace($this->pattern, $this->replacement, $content);
}

Однако, работаетвыше дает мне ошибку ниже:

regexTextReplace::rule() must be of the type array, string returned

Я подозреваю, что из-за изменения в структуре JSON мои функции синтаксического анализа больше не работают.

Я не уверен, что нужно изменить - кто-нибудь может мне помочь?

Редактировать:

Так что, глядя на ответ ниже, добавив [$rows] вместо $rows исправляет ошибку, но в конечном итоге создает вложенный массив, как кажется.

Если я делаю дамп дампа, как:

dd($rows);

На самом деле он возвращает массив:

array:3 [▼
  0 => "My name is Trevor"
  1 => ""
  2 => ""
]

Так почему же это выглядит как строка?

1 Ответ

1 голос
/ 09 июля 2019

Вы можете отправить $rows в виде массива в функцию rule(), просто обернув его в []:

array_map([$this, 'rule'], [$rows]);

Тогда функция получит массив, а не строку.

В противном случае вы можете изменить свой код и использовать вместо него строку, но я не вижу большого преимущества.

...