尝试将数组值转换为字符串值时,Implode() 不起作用

问题描述 投票:0回答:1

我正在 Laravel 中工作,并尝试创建一个数据集以稍后进行 json_encode

这是我的数据数组

    $o365_data = [];
    $o365_data['o365_trigger_url'] = env('COMPLAINT_POWERAPP_URL');
    $o365_data['completion_time'] = $complaint->created_at->format('d M Y - H:i:s');
    $o365_data['submission_serial'] = $complaint->id;

    foreach ($rules as $rule) {
            $o365_data['rule_broken'][] = [ 'name' => $rule->name, ]  ;
        }

    $o365_data['details'] = $complaint->details;

转储数组会导致这样的结果

array:11 [
  "o365_trigger_url" => "https://azure.com/"
  "completion_time" => "18 Sep 2023 - 11:08:43"
  "submission_serial" => 60
  "rule_broken" => array:2 [▼
    0 => array:1 [▼
      "name" => "Campaign expenditure: Candidate opportunity"
    ]
    1 => array:1 [▼
      "name" => "Campaign expenditure: Receipts and accounting"
    ]
  ]
  "details" => "zbxcvbvxb"
]

如您所见,主数据数组内还有另一个数组值。所以我想将数组值转换为字符串值。

为了实现这一点,我编写了以下代码

    foreach ($o365_data as $index => $data) {
        if (is_array($data)) {
              $implode_string =  " ";
              $o365_data[$index] = implode($implode_string, $data);
        }
    }

    dd($o365_data);

但我收到错误。

**如何更正我的代码。

我希望将rule_broken值转换为字符串。**

"rule_broken" => "Campaign expenditure: Candidate opportunity , Campaign expenditure: Receipts and accounting"
php arrays laravel implode
1个回答
1
投票

发生这种情况是因为

rule_broken
是 2D。

您可以通过两种方式实现您想要的:

解决方案 1(针对您的用例):

foreach ($o365_data as $index => $data) {
    if (is_array($data)) {
        $values = array_map(function ($item) {
            return $item['name'];
        }, $data);

        $o365_data[$index] = implode(', ', $values);
    }
}

在上面的示例中,我们可以只解析您的示例,如果

name
键发生变化,或者我们想要像
o365_data
那样在
$o365_data['an_array'] = [1, 2, 3];
中拥有一个数组,则此代码是无用的。

解决方案2(递归):

您可以定义一个函数并将其命名为

implodeMyArray
:

function implodeMyArray($data, $implodeSeparator = ',') {
    if (is_array($data)) {
        foreach ($data as $key => $value) {
            $data[$key] = implodeMyArray($value);
        }
        return implode($implodeSeparator, $data);
    }
    return $data;
}

然后在循环中调用此函数:

foreach ($o365_data as $index => $data) {
    $o365_data[$index] = implodeMyArray($data);
}

第一个解决方案的问题将通过这个递归函数得到解决。

© www.soinside.com 2019 - 2024. All rights reserved.