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_timelikesimagesid键,但是,上面的代码不起作用。关于为什么的任何想法?还有其他优雅的解决方案来实现同样的目标吗?

4

5 回答 5

9

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

使用参考:

foreach($data as &$media) {

取消设置$data

unset($data[$media][$media_key]);
于 2012-12-03T23:38:23.863 回答
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);
于 2012-12-03T23:39:02.860 回答
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] = ...
于 2012-12-03T23:41:32.163 回答
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 循环中使用引用,因为您需要取消设置引用的变量。如果没有,就会发生难以检测的错误。

于 2012-12-03T23:43:23.757 回答
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]); //
    
于 2012-12-03T23:41:54.037 回答