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_timeを保持しようとしていますがlikes、上記のコードは機能しません。理由についてのアイデアはありますか?同じことを達成するための他のエレガントなソリューションはありますか?imagesid

4

5 に答える 5

9

これが機能しない理由は、元の$dataオブジェクトから設定を解除していないためです。2 つの方法のいずれかで修正できます。参照によってアクセスするか、代わりunsetに元のオブジェクトを操作するように更新してください。$data

参照の使用:

foreach($data as &$media) {

からの設定解除$data

unset($data[$media][$media_key]);
于 2012-12-03T23:38:23.863 に答える
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 に答える
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 に答える
0

まず、使用する必要はありません

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

あなたが使用することができます

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

代わりは

しかし、あなたの質問では、最初の行で$ dataを調べており、各サイクルで$dataの現在の値が$mediaに割り当てられています。ただし、メディアには元の$ dataへの接続がないため、新しい値が$dataから$mediaに割り当てられると、次の反復で破棄されます。

2つのオプションがあります。

  1. 参照を使用する:

    foreach($data as &$media) { // and so on... this should work, but i don't suggest it
    
  2. 最初の行に、

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

    そして4行目に、

    unset($data[$media_k][$media_key]); //
    
于 2012-12-03T23:41:54.037 に答える