Ajaxで配列から要素をunset()
するとき、array_values()
をしない場合に配列が勝手にオブジェクトになるという現象を見つけました。
以下がそのソースコードになります。原因が分かる方いらっしゃいませんでしょうか。
###該当のソースコード
まず「ajax.js」でクリックすると、'my_ajax_test'
というAJAXイベントが実行されます。
次にそのAJAXイベントが書かれた「ajax.php」で配列から要素をunset()
するのですが、そこで先述の問題が生じまして、「ajax.js」のresponce
にはなぜか配列でなくオブジェクトが返るのです。
????「ajax.js」
$(document).on('click','.my_ajax_test', function(){ $.ajax({ url : 'http:/example.com/wp-admin/admin-ajax.php', type : 'POST', dataType: 'json', data : { action: 'my_ajax_test' } }) .done( function( responce ) { // なぜか responce の中の removed_arr の値がオブジェクトになっている console.log( responce ); }) });
????「ajax.php」
// AJAXイベントの実行 add_action( 'wp_ajax_my_ajax_test', 'my_ajax_test' ); function my_ajax_test() { /* 返り値 $result = [ $init_arr, $removed_arr, $added_arr ]; 問題点 my_remove_data() の中で array_values() しない場合に $removed_arr がオブジェクトになってJSの responce に返ります */ $result = []; $init_arr = [ ['name'=>'grape','num'=>2], ['name'=>'melon','num'=>1] ]; $result['init_arr'] = $init_arr; $removed_arr = my_remove_data( $init_arr, 2 ); $result['removed_arr'] = $removed_arr; array_unshift( $init_arr, ['name'=>'apple','num'=>3] ); $result['added_arr'] = $init_arr; echo json_encode( $result ); die(); } // 配列から要素を削除 function my_remove_data( $arr, $num ){ /* 使用例 以下の引数を渡して $arr= [ ['name'=>'grape','num'=>2], ['name'=>'melon','num'=>1] ]; でもし $num=2 ならそれをunsetして以下を返す $arr= [ ['name'=>'melon','num'=>1] ]; */ foreach($arr as $k1=>$a) { foreach($a as $k2=>$b) { if($b == $id) { unset($arr[$k1]); } } } //return array_values($arr); // ←これなら問題は生じない return $arr; // ←これだと問題が生じる }
###試したこと
繰り返しになりますが、my_remove_data()
で配列から要素をunset()
するときにarray_values()
を通せば問題は生じず、responce
の中のremoved_arr
の値はオブジェクトでなく配列で返ることを確認済みです。
そして以下のようにPHPテストツールで(配列の部分だけですが)実行した場合は問題は生じずやはりremoved_arr
は配列でしたので、WordPressでのみ生じるもののように思います。
????PHPテストツールでの実行結果
https://3v4l.org/TLADQ
おとなしくarray_values()
を書けばいい話ですが、なぜオブジェクトで返ってしまうことになるのか、原因を知りたいです。
ご意見、ご回答どうぞ宜しくお願い申し上げます。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/11/26 07:15
2019/11/26 07:17
2019/11/26 07:36
2019/11/26 08:23