我有两组数组,第一个数组包含名为" all"的所有类别,第二个数组包含名为" selected"的所选类别,我想将此概念填充到多个组合箱,
$all = [
0 => [
'id'=>1,
'name' => 'news'
],
1 => [
'id'=>2,
'name' => 'tips'
],
2 => [
'id'=>3,
'name' => 'trick'
],
3 => [
'id'=>4,
'name' => 'review'
]
];
$selected = [
0 => [
'id'=>2,
'name' => 'trick'
],
1 => [
'id'=>4,
'name' => 'review'
],
];
我试图在foreach中做foreach,但是当我在组合框中显示时,我有重复的数据,我希望得到来自" all"的所有数据。显示来自"选择"。
的选定数据我刚以不同的方式解决了我的问题,首先我添加了默认的密钥和值" sel" => 0 in" all"数组,然后我循环通过数组"所有"和阵列" sel"获取相似的值,当它匹配时将sel键更改为1,此代码用于进一步说明
public static function compare($sel,$all){
// add sel key with default value = 0
foreach($all as $k=>$v){
$all[$k]['sel'] = 0;
}
foreach($all as $k=>$v){
foreach($sel as $k2=>$v2){
// when match change sel to 1
if($v['id'] == $v2['id']){
$all[$k]['sel'] = 1;
}
}
}
return $all;
}
最终结果:
$all = [
0 => [
'id'=>1,
'name' => 'news',
'sel' => 0
],
1 => [
'id'=>2,
'name' => 'tips',
'sel' => 0
],
2 => [
'id'=>3,
'name' => 'trick',
'sel' => 1
],
3 => [
'id'=>4,
'name' => 'review',
'sel' => 1
]
];
只要在$ all [' sel'] = 1时选择条件,就应该选择它们,谢谢所有:D
答案 0 :(得分:0)
您可以使用array_uintersect
和自定义回调函数(compare
)获取两个数组的交集。
function compare($a, $b){
if($a['id'] == $b['id']){
return 0;
}
return 1;
}
$res = array_uintersect($selected, $all,"compare");
print_r($res);
>Array ( [0] => Array ( [id] => 2 [name] => trick ) [1] => Array ( [id] => 4 [name] => review ) )
之后,您只需循环遍历最终数组并设置相应的复选框。
如果您想按名称进行比较,只需创建另一个回调函数。
function compare2($a, $b){
if($a['name'] == $b['name']){
return 0;
}
return 1;
}
答案 1 :(得分:0)
重复项是由内部for循环继续创建select元素引起的,即使在找到所选元素之后也是如此。你可以避免使用内部循环并使用php的in_array()函数来检查$ all是否在$中被选中:
$x = '';
foreach($all as $a){
if(in_array($a, $selected)){
$x .= '<option selected>'.$a['id'].'Selected </option>';
}else{
$x .= '<option>'.$a['id'].'Not selected </option>';
}
}
echo $x;
请注意,in_array将检查元素的所有值,因此例如id为2但名称不同的元素将显示为未选中。您可能希望将两个名称都更改为提示。我希望有所帮助。