首页 > 解决方案 > PHP循环如果相同的键则合并值

问题描述

抱歉,我的英语不好,我想在这里询问重复的问题,答案可能不是我的情况,我有一个由多个数组 $_POST 生成的数组,例如

<input type="checkbox" class="styled" data-controller="company-group" data-action="index" name="checkbox[company-group][index]" value="1" checked=""> 
<input type="checkbox" class="styled" data-controller="company-group" data-action="create" name="checkbox[company-group][create]" value="1" checked=""> 
<input type="checkbox" class="styled" data-controller="company-group" data-action="update" name="checkbox[company-group][update]" value="1" checked=""> 
<input type="checkbox" class="styled" data-controller="company-group" data-action="delete" name="checkbox[company-group][delete]" value="1" checked=""> 

<input type="checkbox" class="styled" data-controller="company-industry" data-action="index" name="checkbox[company-industry][index]" value="1" checked=""> 
<input type="checkbox" class="styled" data-controller="company-industry" data-action="create" name="checkbox[company-industry][create]" value="1" checked=""> 
<input type="checkbox" class="styled" data-controller="company-industry" data-action="update" name="checkbox[company-industry][update]" value="1" checked=""> 
<input type="checkbox" class="styled" data-controller="company-industry" data-action="delete" name="checkbox[company-industry][delete]" value="1" checked=""> 

$_POST['复选框']

checkbox: checkbox%5Bcompany-group%5D%5Bindex%5D=1&checkbox%5Bcompany-group%5D%5Bview%5D=1&checkbox%5Bcompany-group%5D%5Bcreate%5D=1&checkbox%5Bcompany-group%5D%5Bupdate%5D=1&checkbox%5Bcompany-group%5D%5Bdelete%5D=1&checkbox%5Bcompany-industry%5D%5Bindex%5D=1&checkbox%5Bcompany-industry%5D%5Bview%5D=1&checkbox%5Bcompany-industry%5D%5Bcreate%5D=1&checkbox%5Bcompany-industry%5D%5Bupdate%5D=1&checkbox%5Bcompany-industry%5D%5Bdelete%5D=1

我已经处理了这段代码:

$asi = urldecode($_POST['checkbox']);
$asu = explode('&', $asi);
$arr = array();
$arr2 = array();

foreach ($asu as $key) 
{
    list ($ass, $iss) = explode('=', $key);
    preg_match_all('/\[(.*?)\]/', $ass, $sue);
    $arr2[] = array_merge_recursive($sue[1]);
}

这是我的 $arr2 结果:

打印_r()

Array
(
    [0] => Array
        (
            [0] => company-group
            [1] => index
        )

    [1] => Array
        (
            [0] => company-group
            [1] => view
        )

    [2] => Array
        (
            [0] => company-group
            [1] => create
        )

    [3] => Array
        (
            [0] => company-group
            [1] => update
        )

    [4] => Array
        (
            [0] => company-group
            [1] => delete
        )

    [5] => Array
        (
            [0] => company-industry
            [1] => index
        )

    [6] => Array
        (
            [0] => company-industry
            [1] => view
        )

    [7] => Array
        (
            [0] => company-industry
            [1] => create
        )

    [8] => Array
        (
            [0] => company-industry
            [1] => update
        )

    [9] => Array
        (
            [0] => company-industry
            [1] => delete
        )
)

var_export()

array (
  0 => 
  array (
    0 => 'company-group',
    1 => 'index',
  ),
  1 => 
  array (
    0 => 'company-group',
    1 => 'view',
  ),
  2 => 
  array (
    0 => 'company-group',
    1 => 'create',
  ),
  3 => 
  array (
    0 => 'company-group',
    1 => 'update',
  ),
  4 => 
  array (
    0 => 'company-group',
    1 => 'delete',
  ),
  5 => 
  array (
    0 => 'company-industry',
    1 => 'index',
  ),
  6 => 
  array (
    0 => 'company-industry',
    1 => 'view',
  ),
  7 => 
  array (
    0 => 'company-industry',
    1 => 'create',
  ),
  8 => 
  array (
    0 => 'company-industry',
    1 => 'update',
  ),
  9 => 
  array (
    0 => 'company-industry',
    1 => 'delete',
  ),
)

json_encode()

[["company-group","index"],["company-group","view"],["company-group","create"],["company-group","update"],["company-group","delete"],["company-industry","index"],["company-industry","view"],["company-industry","create"],["company-industry","update"],["company-industry","delete"]

如何在循环时合并同一键上的值,我想要的结果是:

Array
(
    [0] => Array
        (
            [key] => company-group
            [val] => Array (
                        [0] => index,
                        [1] => create,
                        [2] => update,
                        [3] => delete,
            )
        )

    [1] => Array
        (
            [key] => company-industry
            [val] => Array (
                        [0] => index,
                        [1] => create,
                        [2] => update,
                        [3] => delete,
            )
        )
)

谢谢你的建议 !

标签: phparrays

解决方案


如果您要将所有这些复选框数据作为 json 集中到一个表列中,那么我会在对数据进行 json 编码之前推荐一种更精简的数组结构。

parse_str()会将您查询字符串格式的数据转换为所需的关联数组的关联数组(每个值都是1)。

从那里,覆盖子数组以将键移动到值,然后生成您的 json 数组。

现在,您的数据可以简单地作为紧凑、可移植的字符串插入到您的数据库中。

代码:(演示

$_POST['checkbox'] = 'checkbox%5Bcompany-group%5D%5Bindex%5D=1&checkbox%5Bcompany-group%5D%5Bview%5D=1&checkbox%5Bcompany-group%5D%5Bcreate%5D=1&checkbox%5Bcompany-group%5D%5Bupdate%5D=1&checkbox%5Bcompany-group%5D%5Bdelete%5D=1&checkbox%5Bcompany-industry%5D%5Bindex%5D=1&checkbox%5Bcompany-industry%5D%5Bview%5D=1&checkbox%5Bcompany-industry%5D%5Bcreate%5D=1&checkbox%5Bcompany-industry%5D%5Bupdate%5D=1&checkbox%5Bcompany-industry%5D%5Bdelete%5D=1';
parse_str($_POST['checkbox'], $output);

var_export($output['checkbox']);
echo "\n---\n";
echo json_encode(array_map('array_keys', $output['checkbox']));

输出:

array (
  'company-group' => 
  array (
    'index' => '1',
    'view' => '1',
    'create' => '1',
    'update' => '1',
    'delete' => '1',
  ),
  'company-industry' => 
  array (
    'index' => '1',
    'view' => '1',
    'create' => '1',
    'update' => '1',
    'delete' => '1',
  ),
)
---
{"company-group":["index","view","create","update","delete"],"company-industry":["index","view","create","update","delete"]}

推荐阅读