🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
WordPress

WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

1回答

960閲覧

WordPressでのみ生じる挙動を見つけたので、その原因を知りたいです

moomoom

総合スコア19

WordPress

WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2019/11/25 18:54

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()を書けばいい話ですが、なぜオブジェクトで返ってしまうことになるのか、原因を知りたいです。

ご意見、ご回答どうぞ宜しくお願い申し上げます。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

配列のキー値が0から続く連番にならなくなってしまうから、ですね
array_valuesするとキー値が振り直されます

php

1<?php 2echo json_encode([0=>0,1=>1,2=>2,3=>3]);//[0,1,2,3] 3echo json_encode([0=>0,2=>2,3=>3]);//{"0":0,"2":2,"3":3}

json_encodeではキー値が0から続く連番になっていない配列は
オブジェクトとして解釈されます

投稿2019/11/25 22:59

編集2019/11/26 07:39
KazuhiroHatano

総合スコア7819

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

moomoom

2019/11/26 07:15

どうもありがとうございます。
moomoom

2019/11/26 07:17

質問にある >????PHPテストツールでの実行結果 >https://3v4l.org/TLADQ ではなぜ、array_valuesを使っていないのに配列になっているのですか?
KazuhiroHatano

2019/11/26 07:36

phpの時点では配列です json_encodeしたときにキー値が0からの連番になっていない配列がオブジェクトになっています テストにあるの3つの配列でも、removed_arrだけが json_encodeしたときにオブジェクトになってしまうはずです
moomoom

2019/11/26 08:23

お詳しいですね。勉強になります。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問