2010-04-06 166 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()函數的很好,但我必須做一些工作;)

相關問題