将两个数组中相等值的key取出来,组成新的数组
比如
$arr1=array('a'=>'File','b'=>'edit','c'=>'right');
$arr2=array('12'=>'file','33'=>'Edit');不区分大小写
组成新的数组:
array('a'=>'12','b'=>'33');
我的循环
foreach($arr1 as $fkey=>$fort)
{
   foreach($arr2 as $ikey=>$insert)
   {
if(strcasecmp($fort,$insert)==0)
{

       $result[$keyvalue]=$ikey;
}
}
}
可我的两数组实际很大有好几千条数据,这样比较太慢,会出错,有更好的方法么 ,哪个大虾帮帮忙~~

解决方案 »

  1.   

    你这个是O(m*n)复杂度的,
    可以分别根据值不区分大小写的排序,排序完了,再二路归并,O(m*logm+n*logn),
    在两数组规模都比较大,且元素个数相差不悬殊的情况下,这种方式可行还有一种思路,倒置索引和值,
    $arr1=array('a'=>'File','b'=>'edit','c'=>'right');
    $arr2=array('12'=>'file','33'=>'Edit'); 先处理arr1,把每个元素的key全部转为大写
    $map['FILE'] = 'a'
    $map['EDIT'] = 'b';
    ................然后处理arr2
    取一个元素 ,如  '12'=>'file'
    把file转为大些字母,一查表,发现$map['FILE']存在,
    立刻取出$map['FILE'],就是'a',于是得到了 'a'=>12。
    这个时间复杂度是 O(m+n),也是最快的,但是需要辅助空间两种方案
    空间和时间,二选一,看着办吧
      

  2.   


    $arr1=array('a'=>'File','b'=>'edit','c'=>'right');
    $arr2=array('12'=>'file','33'=>'Edit');
    $a = array_map("strtolower",$arr1);
    $b = array_map("strtolower",$arr2);
    $arr3=array_intersect($a,$b);
    $arr4=array_intersect($b,$a);
    $c=array_flip($arr3);
    $d=array_flip($arr4);$e=array_combine($c,$d);
    print_r($e);用PHP内置函数也许快点
      

  3.   

    $arr1=array('a'=>'File','b'=>'edit','c'=>'right','d'=>'File'); 
    $arr2=array('12'=>'file','33'=>'Edit'); 要得到array('a'=>'12','b'=>'33','d'=>'12');
      

  4.   


    那么
    $arr1=array('a'=>'File','b'=>'edit','c'=>'right','d'=>'File');
    $arr2=array('12'=>'file','33'=>'Edit','65'=>'file'); 
    是什么结果?
      

  5.   

    sorry,说错了,$arr2中没有重复值
    就是想能过$arr2找到$arr1中的key,再分别用对应的key组成新数组
      

  6.   

    <?php
    $arr1 = array('a'=>'File','b'=>'edit','c'=>'right'); 
    $arr2 = array('12'=>'file','33'=>'Edit'); foreach($arr1 as $ka=>$va) {
      $va = strtolower($va);
      foreach($arr2 as $kb=>$vb) {
        if($va == strtolower($vb)) {
          $r[$ka] = $kb;
        }
      }
    }
    print_r($r);Array ( [a] => 12 [b] => 33 )
      

  7.   


    可以重复,把 $map['FILE']弄成一个数组即可
      

  8.   


    $arr1=array('a'=>'File','b'=>'edit','c'=>'right','d'=>'File');
    $arr2=array('12'=>'file','33'=>'Edit');
    $arr1 = array_map('strtolower',$arr1);
    $arr2 = array_map('strtolower',$arr2);$arr3=array_flip($arr2);
    function getNew($str){
    global $arr2;
    global $arr3;
    if(in_array($str,$arr2)){
    return $arr3[$str];
    }else{
    return false;
    }
    }
    $a = array_map("getNew",$arr1);
    $a = array_diff($a,array(''));print_r($a);试试这个
      

  9.   


    $arr1=array('a'=>'File','b'=>'edit','c'=>'right','d'=>'File','e'=>'file','f'=>'323d');
    $arr2=array('12'=>'file','33'=>'Edit');
    $arr1 = array_map('strtolower',$arr1);
    $arr2 = array_map('strtolower',$arr2);
    $arr3=array_flip($arr2);function getNew($str){
    global $arr3;
    return @$arr3[$str];
    }$a = array_map("getNew",$arr1);
    $a = array_diff($a,array(''));print_r($a);精简了下
      

  10.   

    $arr1=array('a'=>'File', 'b'=>'edit', 'c'=>'right', 'd'=>'File');
    $arr2=array('12'=>'file','33'=>'Edit'); foreach ($arr1 as $k=>$v)
        $map[strtoupper($v)][]=$k;foreach ($arr2 as $k=>$v) {
        $v = strtoupper($v);
        if (isset($map[$v])) {
            foreach ($map[$v] as $f) 
                $ret[] = array($f=>$k);
        }   
    }print_r($ret);
      

  11.   


    就是这个样子,不知道array_flip是如何处理重复值的
      

  12.   

    array_flip
    如果同一个值出现了多次,则最后一个键名将作为它的值,所有其它的都丢失了。 
      

  13.   

    奇怪了,我直接用这个例子可以,可是用我的程序就不行了,function getNew()中的$arr3得不到值呢
      

  14.   

    在函数的外部,有$arr3这个数组么?