2010-04-06 81 views
6

我有如下所示的阵列:从2D阵列中删除键的最简单方法?

array(
    0 => array(
    'key1' => 'a', 
    'key2' => 'b', 
    'key3' => 'c' 
), 
    1 => array(
    'key1' => 'c', 
    'key2' => 'b', 
    'key3' => 'a' 
), 
    ... 
) 

我需要一个函数来获得仅包含(变量)的阵列的键的数量,即reduce_array(阵列(“KEY1”,“KEY3”)) ;应该返回:

array(
    0 => array(
    'key1' => 'a', 
    'key3' => 'c' 
), 
    1 => array(
    'key1' => 'c', 
    'key3' => 'a' 
), 
    ... 
) 

这样做的最简单方法是什么?如果可能,没有像array_filter或array_map这样的其他辅助函数,因为我的同事已经在使用太多的函数来抱怨我。

源数组将始终具有给定的键,因此不需要检查是否存在。

如果这些值是唯一的,则奖励分数将始终相互关联,这意味着如果key1具有值a,那么其他键将始终具有值b)。其作品,但

我目前的解决方案是相当笨拙(连名字是可怕的,但不能找到一个更好的):

function get_unique_values_from_array_by_keys(array $array, array $keys) 
{ 
     $result = array(); 
     $found = array(); 

     if (count($keys) > 0) 
     { 
       foreach ($array as $item) 
       { 
         if (in_array($item[$keys[0]], $found)) continue; 
         array_push($found, $item[$keys[0]]); 
         $result_item = array(); 
         foreach ($keys as $key) 
         { 
           $result_item[$key] = $item[$key]; 
         } 
         array_push($result, $result_item); 
       } 
     } 
     return $result; 
} 

加成
PHP版本5.1.6是。

回答

6

如果你的同事不喜欢array_filter或array_map,那就是他们缺乏教育和品味。虽然我不建议在工作中烧毁桥梁,但他们通常是解决问题的最佳方法。

 
function reduce_array($array, $keys) { 
    $keys_map = array_fill_keys($keys, true); 
    return array_map(function ($subarray) use ($keys) { 
    return array_intersect_key($subarray, $keys_map); 
    }, $array); 
} 

(注:我使用上面仅在PHP> = 5.3中提供的匿名功能,所以你可能不能使用它们)

如果你必须这样做没有array_map和匿名函数:

 
function reduce_array($array, $keys) { 
    $ret = array(); 
    $keys_map = array_fill_keys($keys, true); 
    foreach ($array as $subarray) { 
    array_push($ret, array_intersect_key($subarray, $keys_map)); 
    } 
    return $ret; 
} 

简单说明:首先,我用array_fill_keys从一个整数索引的数组转钥匙串索引的数组(我给它的价值,true,并不真正的问题在这里)。这使得它适合array_intersect_key的输入,这将确实减少你正在寻找。

+0

很不错, @jemfinch。 – karim79 2010-04-06 13:34:03

+0

非常好的解决方案,看起来就像我需要的,但我会在接受之前等待其他可能的解决方案。 – dbemerlin 2010-04-06 13:37:45

1

仅使用in_array()函数。字符计数可减少,但我们会离开它读取:

function reduce_array($array, $keys) { 
    $res=array(); // Our result array 
    foreach($array as $v1){ // Loop thru original array 
     $t1=array(); // Our new inner array 
     foreach($v1 as $k2=>$v2){ // Loop thru original inner array 
      if(in_array($k2,$keys)) $t1[$k2]=$v2; //If inside inner array store 
     } 
     $res[]=$t1; //Add to result array 
    } 
    return($res); 
} 

我渴望摆脱in_array()函数的很好,但我必须做一些工作;)

相关问题