【问题标题】:how to set selected multiple combo box based on array如何根据数组设置选定的多个组合框
【发布时间】:2016-06-06 08:25:26
【问题描述】:

我有两组数组,第一个数组包含称为“全部”的所有类别,第二个数组包含称为“选定”的选定类别,我想将此概念填充到多个组合框,

$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”中的所有数据与“selected”中的选定数据一起显示。

我刚刚以不同的方式解决了我的问题,首先我在“all”数组集中添加默认的键和值“sel”=>0 对,然后我循环通过数组“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 时添加 if 条件,它们应该被选中,谢谢大家 :D

【问题讨论】:

  • 请显示您当前的 foreach 循环
  • 请稍等
  • $x = ''; foreach($all as $a){ foreach($selected as $sel){ if($a['id'] == $sel['id']){ $x .= '<option selected>value here</option>'; }else{ $x .= '<option>value here</option>'; } } }

标签: php arrays combobox


【解决方案1】:

您可以使用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;
}

【讨论】:

  • 感谢您的回答,但是当 array_intersect() 函数比较两个(或更多)数组的值并返回匹配项时,“比较”回调实际上做了什么。
  • compare 函数将从每个数组中获取一个值并检查“id”(比较)或“名称”(比较2)是否相等。如果它们相等,它将返回 0,表示值相等。如果不是,我们返回 1。这样它决定了从 array_uintersect 返回的值。您不能使用array_intersect,因为您的数组由数组组成,并且您无法指定回调函数。我希望这能说明问题。
【解决方案2】:

重复是由于内部 for 循环在找到选定元素后仍继续创建选定元素造成的。您可以避免使用内部循环并使用 php 的 in_array() 函数来检查 $all 是否在 $selected 中,如下所示:

$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 但名称不同的元素将显示为未选中。您可能希望将两个名称都更改为提示。我希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多