###前提・実現したいこと
$targetと$nokosu_keysが与えられます。これは前提です。
そして$targetから、キーが$nokosu_keysのものだけ残したいです。
php
1$target = [ 2 'a'=>['ak'=>'av'], 3 'b'=>['bk'=>'bv'], 4 'c'=>['ck'=>'cv'], 5 'd'=>['dk'=>'dv'], 6]; 7$nokosu_keys = ['a','c','e'];
つまり$targetからa,c,eのキーを残し(eはないのでスルーされて)、欲しい値はこうなのですが、どうしたらよろしいか教えてもらえませんでしょうか?
php
1array(2) { 2 ["a"]=> 3 array(1) { 4 ["ak"]=> 5 string(2) "av" 6 } 7 ["c"]=> 8 array(1) { 9 ["ck"]=> 10 string(2) "cv" 11 } 12}
###試したこと1つ目
1つ目はこれを試しました。
php
1// 1つ目 2test1($target,$nokosu_keys); 3function test1($target,$nokosu_keys){ 4 $result = array_diff($target,$nokosu_keys); 5 $result = array_values($result); 6 var_dump($result); 7}
「Array to string conversion in」のエラーでした。
###試したこと2つ目
2つ目にこれを試しました。
php
1// 2つ目 2test2($target,$nokosu_keys); 3function test2($target,$nokosu_keys){ 4 foreach($target as $target_key=>$target){ 5 foreach($nokosu_keys as $nokosu_key ){ 6 if($target_key != $nokosu_key){ 7 unset($target[$target_key]); 8 } 9 } 10 } 11 var_dump($target); 12}
でもこうなってしまいました。
php
1array(1) { 2 ["dk"]=> 3 string(2) "dv" 4}
###試したこと3つ目(できました)
以下でできました。変でしょうか?
array_intersect_keyが連想配列同士でしか使えないみたいなので、array_fill_keysでひとまず連想配列にしたという処理です。
php
1test3($target,$nokosu_keys); 2function test3($target,$nokosu_keys){ 3 $nokosu_keys = array_fill_keys($nokosu_keys, 'xxx'); // ひとまず連想配列にする 4 $result = array_intersect_key($target, $nokosu_keys); // 連想配列同士でのみ削除できる 5 var_dump($result); 6}
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/11/12 00:54
退会済みユーザー
2020/11/12 01:17
2020/11/12 01:24
退会済みユーザー
2020/11/12 01:39
2020/11/12 01:58 編集