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]);
}

这是我的 $arr 2 结果:

print_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,
)
)
)

感谢您的建议!

如果您要将所有这些复选框数据作为 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"]}

只回答你的问题,如何转换 arr2。
您可以循环数组并构建一个新数组。
使用post数组很可能有更好的方法,但我的午休时间已经结束,所以我把它留给Mickmack。

Foreach($arr2 as $sub){
$new[$sub[0]]["key"] = $sub[0];
$new[$sub[0]]["val"][] = $sub[1];
}
Var_dump(array_values($new));

https://3v4l.org/HKM7S

与其使用key作为键,不如使用实际的数组键。

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

简短回答:

$result=[];
foreach ($_POST["checkbox"] as $i=>$checkbox){
$result[]=["key"=>$i,"val"=>array_keys($checkbox)];
}
echo "<pre>";
var_export($result);
echo "</pre>";

?>

如果使用jQuery,请阅读此链接以发送对象,如果使用文本查询字符串将其转换为:parse_str($_POST["checkbox"], $array);

PHP 默认行为为:

<?php
echo "<pre>";
var_dump($_POST);
echo "</pre>";
?>
<form action="test.php" method="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="">
<br>
<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="">
<input type="submit">

结果:

array(1) {
["checkbox"]=>
array(2) {
["company-a"]=>
array(2) {
["index"]=>
string(1) "1"
["delete"]=>
string(1) "1"
}
["company-b"]=>
array(3) {
["create"]=>
string(1) "1"
["update"]=>
string(1) "1"
["delete"]=>
string(1) "1"
}
}
}

为了你的愿望:

<?php
$result=[];
foreach ($_POST["checkbox"] as $i=>$checkbox){
$temp=["key"=>$i];
foreach ($checkbox as $val_key=>$val){
$temp["val"][]=$val_key;
}
$result[]=$temp;
}
echo "<pre>";
var_export($result);
echo "</pre>";

方法2:

$result=[];
foreach ($_POST["checkbox"] as $i=>$checkbox){
$result[]=["key"=>$i,"val"=>array_keys($checkbox)];
}
echo "<pre>";
var_export($result);
echo "</pre>";

?>

最新更新