JSON结构已更改,破坏了方法

时间:2019-07-09 17:54:11

标签: php php-7

目前,我的数据库中存储了以下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."
   }
]

我有一个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 个答案:

答案 0 :(得分:1)

您可以将$rows作为数组发送到rule()函数,只需将其包装在[]中即可:

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

然后该函数将接收一个数组,而不是字符串。

否则,您可以重构代码并改用字符串,但我看不出太多优势。