$newarr=array();
for($i=0;$i<count($arr);$i++)
{
    $newarr=array_merge($newarr,$arr[$i]);
}
$tmpAry=array_unique($newarr);
//$tmpAry = array_keys($newarr); $j=0;
 foreach($tmpAry as $key=>$val){
 
  $newKey = substr($val, 0, strpos($val, "@"));

  $newStr = !empty($newAry) && array_key_exists($newKey, $newAry) ? $newAry[$newKey].",".substr($val,strpos($val, "@")+1, strlen($val)) : $val;
  if(preg_match("/all/i", $newStr)){$newStr = $val;}  $newStr = implode(",", array_unique(split(",", $newStr)));

    //echo $j.">".$newStr."<br>";
    $newAry[$newKey] = $newStr;
$j++;
 }
 $newAry = array_values($newAry);老是出现重复值

解决方案 »

  1.   

    for($i=0,$result=array();$i<=count($arr);$i++)
    {
    $result=array_merge($result,$arr[$i]);
    }
      

  2.   

    重复值就是说,如果并集里面有重复的值,就去掉重复值。如果值有ALL,就只取ALL,其余去掉
      

  3.   

    抛块儿砖:
    <?php
    $arr = array 

        0 => array 
            ( 
                '1@01,02', 
                '2@01,02',
                '4@ALL', 
         '3@01',
                '5@01,02,04', 
            ),     1 => array 
            ( 
                '1@01,02,03', 
                '2@01,02,04', 
                '3@ALL', 
                '4@01,02', 
         '111@01,05', 
         '5@03', 
            ), 
        2 => array 
            ( 
                '1@01,02,03', 
                '2@02,03,05', 
                '3@ALL', 
                '4@01,02,03', 
         '111@01,05', 
         '5@03', 
            ), ); $result = array();
    foreach($arr as $V)
    {
    foreach($V as $v)
    {
    list($KEY, $VALUE) = explode("@", $v);
    if($result[$KEY]===false) continue;
    $value = explode(",", $VALUE);
    foreach($value as $t)
    {
    if($t == "ALL")
    {
    $result[$KEY] = false;
    break;
    }
    elseif($result[$KEY]!==false) $result[$KEY][]=$t;
    }
    }
    }foreach($result as $k=>$v) $result[$k]=$k."@".(is_array($v)?join(",", array_unique($v)):"ALL");
    print_r($result);
    ?>结果:Array
    (
        [1] => 1@01,02,03
        [2] => 2@01,02,04,03,05
        [4] => 4@ALL
        [3] => 3@ALL
        [5] => 5@01,02,04,03
        [111] => 111@01,05
    )
      

  4.   

    <?php
    $arr = array
    (
        0 => array(
        '1@01,02',
        '2@01,02',
        '4@ALL',
        '3@01',
        '5@01,02,04',
        ),    1 => array(
        '1@01,02,03',
        '2@01,02,04',
        '3@ALL',
        '4@01,02',
        '111@01,05',
        '5@03',
        ),
        2 => array(
        '1@01,02,03',
        '2@02,03,05',
        '3@ALL',
        '4@01,02,03',
        '111@01,05',
        '5@03',
        ),
    );
    $allList = array();
    $result = array();function reExplode(&$item,$key,$seq){
        $item = explode($seq,$item);
    }
    function reJoin(&$item,$key,$seq){
        $list = array_unique(explode($seq,$item));
        if (in_array('ALL', $list)){
            $item = $key.'@ALL';
        }else{
            $item = $key.'@'.implode($seq,$list);
        }
    }
    foreach($arr as $item){
        array_walk($item, 'reExplode','@');
        $allList = array_merge($allList, $item);
    }foreach($allList as $item){
        if(count($item) != 2){
            continue ;
        }
        $result[$item[0]] .= $item[1].',';
    }
    array_walk($result, 'reJoin',',');
    sort($result);
    var_export($result);
    ?>
    写的比较急,很乱~希望你看不懂。
      

  5.   

    好吧~~烂到底吧~~
    容易理解一些了~但还是很烂。
    <?php
    $arr = array
    (
        0 => array(
        '1@01,02',
        '2@01,02',
        '4@ALL',
        '3@01',
        '5@01,02,04',
        ),    1 => array(
        '1@01,02,03',
        '2@01,02,04',
        '3@ALL',
        '4@01,02',
        '111@01,05',
        '5@03',
        ),
        2 => array(
        '1@01,02,03',
        '2@02,03,05',
        '3@ALL',
        '4@01,02,03',
        '111@01,05',
        '5@03',
        ),
    );
    $result = array();
    foreach($arr as $items){
        if(is_array($items)){
            foreach($items as $item){
                $item = explode('@', $item);
                if(count($item) != 2){
                    continue ;
                }
                $result[$item[0]] .= $item[1].',';
            }
        }
    }
    function reJoin(&$item,$key,$seq){
        $list = array_unique(explode($seq,$item));
        if (in_array('ALL', $list)){
            $item = $key.'@ALL';
        }else{
            $item = $key.'@'.join($seq,$list);
        }
    }
    array_walk($result, 'reJoin',',');
    sort($result);
    var_export($result);
    /**
     * array (
      * 0 => '111@01,05,',
      * 1 => '1@01,02,03,',
      * 2 => '2@01,02,04,03,05,',
      * 3 => '3@ALL',
      * 4 => '4@ALL',
      * 5 => '5@01,02,04,03,',
      * )
     */
    ?>