我试图仅保留某些密钥,并从外部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_time
,likes
,images
和id
键,但上述代码无效。任何想法为什么?任何其他优雅的解决方案,以达到同样的目的?
答案 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分配新值时,它会在下一次迭代时被丢弃。
您有两种选择:
使用参考:
foreach($data as &$media) { // and so on... this should work, but i don't suggest it
在第一行,写
foreach($data as $media_k => $media) {
并在第四行写下
unset($data[$media_k][$media_key]); //