如何基于数组设置选定的多个组合框

时间:2016-06-06 08:25:26

标签: php arrays combobox

我有两组数组,第一个数组包含名为" 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

2 个答案:

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