2012-12-03 46 views
3

我想只保留某些鍵,並從外部API中刪除其餘鍵。我有一個數組(http://pastebin.com/vU8T4y7h),「數據」包含的對象:在關聯數組中不工作的鍵刪除

foreach ($data as $media) { 
    foreach (array_keys($media) as $media_key) { 
     if ($media_key!=="created_time" && $media_key!=="likes" && $media_key!=="images" && $media_key!=="id") { 
      unset($media[$media_key]); 
     } 
    } 
} 

在這種情況下,我試圖僅保持created_timelikesimages,和id鍵,然而,上面的代碼ISN」不工作。任何想法爲什麼?任何其他優雅的解決方案來實現相同的事情?

回答

8

這是不工作的原因是因爲你不是從原來的$data對象不設置。您可以通過以下兩種方法中的一種來解決它通過參考訪問或者更新您的unset以代替原來的$data對象。

使用參考:

foreach($data as &$media) { 

$data

unset($data[$media][$media_key]); 
1
的foreach

創建取消設置每個數組元素的副本,所以解封$媒體[$ media_key]只從複製取消設置;並希望從原來的$ data數組來取消:

foreach ($data as $mediaRef => $media) { 
    foreach (array_keys($media) as $media_key) { 
     if ($media_key!=="created_time" && $media_key!=="likes" && $media_key!=="images" && $media_key!=="id") { 
      unset($data[$mediaRef][$media_key]); 
     } 
    } 
} 

或(引用)

foreach ($data as &$media) { 
    foreach (array_keys($media) as $media_key) { 
     if ($media_key!=="created_time" && $media_key!=="likes" && $media_key!=="images" && $media_key!=="id") { 
      unset($media[$media_key]); 
     } 
    } 
} 
unset($media); 
+0

當從原始數據源中刪除時,需要使用foreach k,v代替第一次迭代時的值。 – sberry

1

您可以使用array_intersect_key做那種事容易:

$keepTheseKeys = array_flip(array('created_time', 'likes', 'images', 'id')); 

foreach ($data as &$media) { 
    $media = array_intersect_key($media, $keepTheseKeys); 
} 
unset($media); 

錯誤

問題中的代碼中的錯誤是,你正在更新一個臨時變量iable,必須通過媒體引用(見上面的例子) - 或引用原始變量:

foreach ($data as $i => $media) { 
    $data[$i] = ... 
+0

我想你想'array_intersect_key'而不是'array_diff_key'。 – NullUserException

+0

的確我在@NullUserException – AD7six

+0

你也想在循環之後使用'unset($ media)'。 – Sven

0

首先,你並不需要使用

foreach (array_keys($media) as $media_key) { 

可以使用

foreach($media as $media_key => $media_value){ 

改爲

但是對於您的問題,在第一行中,您正在檢查$ data,並且在每個週期中,t他將$ data中的當前值分配到$ media中。但是媒體沒有任何連接返回到原始的$ data,所以當下次迭代時,當新值從$ data分配給$ media時,它將被丟棄。

你有兩個選擇:

  1. 使用引用:

    foreach($data as &$media) { // and so on... this should work, but i don't suggest it 
    
  2. 在第一線

    ,寫

    foreach($data as $media_k => $media) { 
    

    ,並在第四行,寫

    unset($data[$media_k][$media_key]); // 
    
1

問了一個優雅的解決方案:

foreach ($data as $key => $media) { 
    foreach (array_keys($media) as $media_key) { 
     if (!in_array($media_key, array("created_time", "likes", "images", "id"))) { 
      unset($data[$key][$media_key]); 
     } 
    } 
} 

我會盡量避免使用的foreach循環引用,因爲你需要取消引用的變量。如果不是,很難發現錯誤。