删除关联数组中的键不起作用

时间:2012-12-03 23:32:29

标签: php arrays associative-array

我试图仅保留某些密钥,并从外部API中删除其余密钥。我有一个数组(http://pastebin.com/vU8T4y7h),“data”包含对象:

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_timelikesimagesid键,但上述代码无效。任何想法为什么?任何其他优雅的解决方案,以达到同样的目的?

5 个答案:

答案 0 :(得分:8)

这不起作用的原因是因为您没有从原始$data对象中取消设置。您可以通过以下两种方式之一修复它。可以通过引用访问,也可以更新unset代替原始$data对象。

使用参考:

foreach($data as &$media) {

取消$data

unset($data[$media][$media_key]);

答案 1 :(得分:1)

foreach创建每个数组元素的副本,因此取消设置$ media [$ 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);

答案 2 :(得分: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);

错误

问题代码中的错误是您正在更新临时变量,或者通过引用传递媒体(参见上面的示例) - 或者参考原始变量:

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

答案 3 :(得分: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循环中使用引用,因为您需要取消设置引用的变量。如果不是,很难发现错误。

答案 4 :(得分:0)

首先,您不需要使用

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

你可以使用

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

代替

但是对于您的问题,在第一行中,您将浏览$ data,并且在每个周期中,$ 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]); //