PHP Fatal error: Unsupported operand types
解決済
回答 2
投稿
- 評価
- クリップ 2
- VIEW 21K+
Fatal error: Unsupported operand types
というerrorを吐きました。
サポートされてない演算子をタイプしたと言われているものの、どこが悪いのかがわかりません。PHPリファレンスを見てきちんと配列演算子を使用したつもりです。
記述した配列マージ用のコードはこれです。
$values['taxonomy'] = $values['taxonomy'] + $t_arr;
不思議なことに、処理データの量が少ない時はこのerrorは出ないようです。問題なく対処できます。しかし処理データの量が増えると配列のマージが不可能になります。
問題が起こらず、配列のマージが完了した場合
[taxonomy] => Array(
[tags] => Array(
[1] => Conditionality, Financial architecture, IFIs general, IMF, Intern,ational)
[2] => 343)
と表示されます。[2]と[tags] は同じ階層に置いています。
処理データ量の問題なのか、またはコードミスなのか、はたまたPHPのバージョン、Apacheのバージョンのせいなのでしょうか。
さっぱり分からなかったため、こちらで質問させていただきました。
よろしければ回答をお願いします。
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 過去に投稿した質問と同じ内容の質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
checkベストアンサー
+1
このエラーは、どちらかが配列ではないという可能性があります。
if (!is_array($values['taxonomy'])) {
$values['taxonomy'] = (array)$values['taxonomy'];
}
if (!is_array($t_arr)) {
$t_arr = (array)$t_arr;
}
このように、両方の型をあわせることでエラーは改善するかと思いますが、こういったエラーが出る時点で事前処理に誤りがあることが多いので、前処理からしっかりと確認することをおすすめします。
if (!is_array($values['taxonomy'])) {
echo 'ERROR $values[\'taxonomy\'] is not array';
print_r($values['taxonomy']);
}
if (!is_array($t_arr)) {
echo 'ERROR $t_arr is not array';
print_r($t_arr);
}
$values['taxonomy']=$values['taxonomy'] + $t_arr;
また、こういったエラー処理も有効かと思います。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
0
phpは「動的型付け」といわれる言語で、変数の型が勝手にころころ変わってしまう言語です。
動的型付けの対義語として、静的型付けがあり、例を挙げるとjavaなどです。
以下のコードは、javaでは(基本的に)エラーになり、phpでは当たり前に実現できるものです。
$hoge = 'a/b/c'; //$hogeはstring
$hoge = explode('/', $hoge);//$hogeはarray ['a','b','c']
javaでも無理やり同じことをするには、Object
型として変数を定義の上、そのとき何型とみなすかをその都度キャストにて明示する必要があります。
これは、「静的型付け言語では、変数の型が勝手に変わらないから、プログラマがいちいち手動で変えなければいけない」わけです。
public class test
{
public static void main(String...args)
{
Object hoge = "a/b/c";
hoge = ((String)hoge).split("/");
for(String elem : (String[])hoge)
System.out.println(elem);
}
}
両者を比較してみてください。動的型付けでは、プログラマが型を意識しなくてもコードが書きやすい反面、場合によっては型が勝手に変わって矛盾を生むことによるエラーが起きやすいです。
ご質問における「不思議なこと」の正体は、「型が勝手に変わる」という動的型付けの性質そのものです。
一方静的型付けでは、プログラマが型を意識しなければいけませんが、型が変わることがないので、ご質問のような「不思議なこと」が起こりません。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.23%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
同じタグがついた質問を見る
関連ワード: unsupported operand types