将两个数组中相等值的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;
}
}
}
可我的两数组实际很大有好几千条数据,这样比较太慢,会出错,有更好的方法么 ,哪个大虾帮帮忙~~
比如
$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;
}
}
}
可我的两数组实际很大有好几千条数据,这样比较太慢,会出错,有更好的方法么 ,哪个大虾帮帮忙~~
可以分别根据值不区分大小写的排序,排序完了,再二路归并,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),也是最快的,但是需要辅助空间两种方案
空间和时间,二选一,看着办吧
$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内置函数也许快点
$arr2=array('12'=>'file','33'=>'Edit'); 要得到array('a'=>'12','b'=>'33','d'=>'12');
那么
$arr1=array('a'=>'File','b'=>'edit','c'=>'right','d'=>'File');
$arr2=array('12'=>'file','33'=>'Edit','65'=>'file');
是什么结果?
就是想能过$arr2找到$arr1中的key,再分别用对应的key组成新数组
$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 )
可以重复,把 $map['FILE']弄成一个数组即可
$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);试试这个
$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);精简了下
$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);
就是这个样子,不知道array_flip是如何处理重复值的
如果同一个值出现了多次,则最后一个键名将作为它的值,所有其它的都丢失了。