【问题标题】:How can I trim data from a value inside array?如何从数组内的值中修剪数据?
【发布时间】:2019-03-21 08:12:48
【问题描述】:

这是我的数据:

$d = $request->request->get('data');

输出:

[{"name":"form[id]","value":"10"},{"name":"form[name]","value":"Telefon2"},{"name":"form[uuid]","value":"bb80878ad4"},{"name":"form[productgroup]","value":"6"},{"name":"form[category]","value":"1"},{"name":"form[documents]","value":"7"}

我想创建一个新数组,即删除提取括号内的变量。

 function trim($d) {
          preg_match('#\[(.*?)\]#', $d, $match);
          return $match[1];
   }


$dData = array_combine(array_column(trim($d), 'name'), array_column($d, 'value'));
$json = json_encode($dData);

但错误是

警告:preg_match() 期望参数 2 是字符串,给定数组

【问题讨论】:

  • 您的输出不是缺少] 吗?如果是,那么您的输出必须是 json
  • 是的,抱歉忘记了一行
  • 在这种情况下我建议你使用json_decode()
  • 你为什么要尝试正则表达式? $json 的预期结果是什么?
  • 我不明白你为什么使用preg_match。您是否考虑过使用array_map

标签: php arrays json string replace


【解决方案1】:

在开始之前,您需要做一些事情。

首先,将trim 函数重命名为extract_name 之类的名称,因为PHP 已经内置了trim 函数,该函数可以删除字符串中的空格或字符掩码中存在的任何字符。
其次,您将需要遍历名称列中的每个元素。您会注意到您从 preg_match 收到的错误是因为您一次性传递了所有值。
第三,我假设$d 的值是一个PHP 对象数组。这是在我使用$d = json_decode($d); 的解决方案中完成并假设的。

使用array_map 代替 foreach 意味着我们可以有一个不错的单列:

function extract_name($d) {
    preg_match('#\[(.*?)\]#', $d, $match);
    return $match[1];
}

$dData = array_combine(array_map('extract_name', array_column($d, 'name')), array_column($d, 'value'));

输出是:

array:6 [
  "id" => "10"
  "name" => "Telefon2"
  "uuid" => "bb80878ad4"
  "productgroup" => "6"
  "category" => "1"
  "documents" => "7"
]

Live demo

【讨论】:

  • 谢谢,这听起来不错。我测试了它,但我收到错误消息Warning: array_map() expects parameter 1 to be a valid callback, function 'new_trim' not found or invalid function name
  • @monkeylove 我已经更新了这个问题。正如我在答案中所说,您需要将原始函数重命名为extract_name,然后它将起作用。
  • 是的,这让我很困惑。但是我命名它,错误消息是:Warning: array_map() expects parameter 1 to be a valid callback, function 'extract_name' not found or invalid function name
  • @monkeylove 你确定你正确地复制了这个答案吗?我在这个答案中添加了一个现场演示,以便更清楚地说明我认为海报试图完成的事情。
  • @monkeylove 函数声明的范围是否与$dData 相同?你抄我的sn-p了吗?该函数必须与您传递给array_map 的字符串同名。如果这不起作用,请尝试创建一个匿名函数并查看是否仍有问题。
【解决方案2】:

我相信你需要这样的东西


$d = ['{"name":"form[id]","value":"10"}', '{"name":"form[name]","value":"Telefon2"}', '{"name":"form[uuid]","value":"bb80878ad4"}', '{"name":"form[productgroup]","value":"6"}'];

function combine(array $d): array
{
    $res = [];
    foreach ($d as $item) {
        $value = json_decode($item, true);
        preg_match('#\[(.*?)\]#', $value['name'], $match);;
        $columnName = $match[1];
        $res[$columnName] = $value['value'];
    }

    return $res;
}


$dData = combine($d);
$json = json_encode($dData);
echo $json;```

【讨论】:

    猜你喜欢
    • 2021-08-07
    • 1970-01-01
    • 1970-01-01
    • 2021-05-11
    • 1970-01-01
    • 2011-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多