PHPのエラー解決方法と配列操作について

このQ&Aのポイント
  • PHPのエラーを解決する方法として、Notice Undefined offsetの警告を消すためには未定義の変数がないか確認する必要があります。
  • 配列の要素を操作する際には、存在しない要素にアクセスしないように注意することが重要です。
  • 配列を操作する際には、foreachループを使用して要素を順番に処理し、必要に応じて要素を削除する方法があります。
回答を見る
  • ベストアンサー

phpのエラーが解決できません

$food["1"]["item0"]="y"; $food["1"]["item1"]="bi"; $food["1"]["item2"]="1300"; $food["1"]["item3"]="20060630"; $food["2"]["item0"]="y"; $food["2"]["item1"]="bi"; $food["2"]["item2"]="1500"; $food["2"]["item3"]="20070630"; $e = "a"; if( $e = "a"){ foreach($food as $key1=>$array){ foreach($array as $key2=>$array2){ if ($food["$key1"]["item2"] <="1300") { unset( $food[$key1]); } } } } 上記のプログラムを書いてローカル環境で実行するとNotice Undefined offsetの警告が沢山 出ます。ググるなどして、未定義の変数などがある場合に出ると他のサイトで読んだのですが上記に特に未定義の 変数は無いように思うのですが・・。 (unsetをecho "hello";などに置き換えると警告は出ません) やりたい事は上記のような配列の集まりが数百個あり、 item2の値の数値により配列を消したりしたいのですが、警告を無くすにはどうしたらよいでしょうか。 (一時配列は1から順に増えていきます) phpを始めたばかりで解決方法を探しているのですがネット上では見つけられません・・。

  • PHP
  • 回答数5
  • ありがとう数0

質問者が選んだベストアンサー

  • ベストアンサー
  • aritkn
  • ベストアンサー率100% (2/2)
回答No.3

まず、そのエラーの解釈はそれで正解です。 ではなぜエラーが出るか、ですが、2個目のforeachを回している時のことを考えてください。 $food["1"]["item2"]の番が来ると、unset($food["1"])が行われます。 次に、$food["1"]["item3"]が参照されますが、既に$food["1"]は丸ごとunsetされているので、未定義状態です。 よってエラーが出ます。 これがNo.1さんの回答後半の話。 次にこれは質問とはずれますが、プログラムの文法について。 if($e = "a") この行は間違っています。PHPでは「=」と「==」と「===」は全部意味が違い、「=」は普通、比較には用いません。 これがNo.1さんの回答前半、またNo.2さん後半の話。 最後にこれも質問とはずれますが、プログラムの作りについて。 必ず$food[番号]["item2"]に値段が入っているようですので、foreachを重ねる必要はありません。 それを考えると、No.2さんの書いたコードを用いる方が正解になります。 それから、unsetをecho "hello";などに置き換えた、というのはとても惜しいですね。 その代わりに echo "key1:$key1/key2:$key2"; var_dump($food); echo "------------------",PHP_EOL; のようにして、key1とkey2として何を参照している時に配列の中身がどうなっていたかをチェックしていたら、プログラムがどう動いているか分かったと思います。

その他の回答 (4)

  • aritkn
  • ベストアンサー率100% (2/2)
回答No.5

No.4さんへ ああ、そうですね。「普通、比較に用いない」はおかしく、「普通、if文には用いない」と書くべきでした。

回答No.4

>この行は間違っています。PHPでは「=」と「==」と「===」は全部意味が違い、「=」は普通、比較には用いません。 通常使わないというよりPHPでは=は比較演算子ですらない。

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.2

そもそも今回のケースで二重にforeachを回す意味がない if( $e === "a"){ foreach($food as $key1=>$array){ if ($food[$key1]["item2"] <="1300"){ unset( $food[$key1]); } } } また、文字列の比較に不等号使うと意図と違う結果を返す可能性があるので 型に注意してチェックしてください

回答No.1

>if( $e = "a"){ まず演算子を理解しなさい。 まぁPHPの場合は比較演算子はある意味特殊だから他の言語でOKの比較演算子もPHPではだめな利用法もあるからね。 今回のはまぁそのパターンの比較演算子だね。 君のそのソースの場合比較演算子以前の間違いだけど >(unsetをecho "hello";などに置き換えると警告は出ません) そりゃ使っている配列unsetしてなくせばループで次に回ってきたときに未定義になるよね。

関連するQ&A

  • foreachについて

    下記の配列についてitem2の値のみ取り出したいのですが、 foreach($food as $key1=>$array){ foreach($array as $key2=>$array2){ echo $food["$key1"]["item2"]; } } foreachで回して取り出すと555444333となります。 543という結果が欲しいのですが、 実際には下記の配列が数百と大量にあり、一次元配列の数字は下記のように0から1ずつ増えていきます。(二次元目のキーは全てitem0~item2となっています) キーの変更をしないでitem2の値のみ一度に取り出すにはどうしたらよいのでしょうか? (取り出す前に配列の削除などのプログラムもあるため、0から順番に並んでいるとは限りません。 ) $food["0"]["item0"]="y"; $food["0"]["item1"]="bi"; $food["0"]["item2"]="5"; $food["1"]["item0"]="y"; $food["1"]["item1"]="dou"; $food["1"]["item2"]="4"; $food["2"]["item0"]="n"; $food["2"]["item1"]="co"; $food["2"]["item2"]="3";

    • ベストアンサー
    • PHP
  • 配列の分割について

    下記のような配列グループが多数あるのですが、配列を2個づつ分割し、最初の2つのitem4の値だけを表示したいのですが、 例えば以下のようにarray_chunkを使って分けてからforeachで回して値を取り出すとNotice: Undefined indexエラーが出ます。(一応目的の「0 1」の値は出るのですが・・) このエラーは何が原因なのでしょうか。邪魔で仕方ありません。 <?php $food["0"]["item0"]="y"; $food["0"]["item1"]="bi"; $food["0"]["item2"]="5"; $food["0"]["item3"]="2012010100"; $food["0"]["item4"]="0"; $food["1"]["item0"]="y"; $food["1"]["item1"]="dou"; $food["1"]["item2"]="4"; $food["1"]["item3"]="2012010102"; $food["1"]["item4"]="1"; $food["2"]["item0"]="n"; $food["2"]["item1"]="co"; $food["2"]["item2"]="3"; $food["2"]["item3"]="2012010101"; $food["2"]["item4"]="2"; $food2 = array_chunk( $food, 2,true); foreach($food2 as $key1=>$array){ foreach($array as $key2=>$array2){ echo $food2["0"]["$key2"]["item4"]; } } ?>

    • ベストアンサー
    • PHP
  • foreachについて

    phpを今勉強中なのですがforeachで少し分からない部分があります。 例えば(1)はnのある配列を消去するだけのプログラムでして、これを (2)のように書き換えてみると、全て表示されてしまい、(1)と同じ動きをしません。 phpマニュアルを読む限り同じ動きをすると思うのですが、array_keys($key1)の中に うまく一時配列のキーが入っていないように思います。 どうしてでしょうか? (1) <?php $food["y"]["bb"]= "k1"; $food["n"]["bb"]= "k2"; $food["n"]["cc"]= "k3"; $food["k"]["dd"]= "k4"; foreach($food as $key=>$key1){ foreach($key1 as $key2=>$key3){ if($key=="n") unset($food[$key][$key2]); } } echo "<pre>"; print_r($food); echo "</pre>"; ?> (2) <?php $food["y"]["bb"]= "k1"; $food["n"]["bb"]= "k2"; $food["n"]["cc"]= "k3"; $food["k"]["dd"]= "k4"; foreach($food as $key=>$key1){ foreach($key1 as $key2=>$key3){ if(in_array("n",array_keys($key1))) unset($food[$key][$key2]); } } echo "<pre>"; print_r($food); echo "</pre>"; ?>

    • ベストアンサー
    • PHP
  • array keys について

    すいません。何度かここで質問しているのですが、いまいち分からない部分があります。 既に何十時間も悩んでいて解決しません。初歩的な質問ですがよろしくお願いします。 結果としてk2k3という表示を期待しているのですが・・。 まず、$key2にはk1k2k3という配列が入り、 それからarray_keys($key2)でキーを取得するのですから array_keys($key2)にはynbが配列として入りますよね? つまり [0]=y [1]=n [2]=b となり、 これをin arrayでyという値を探して、あった場合にはunsetで削除。 何がおかしいのかさっぱり分かりません。 すいませんが間違っている部分を教えてもらえませんか? <?php $food["y"]= "k1"; $food["n"]= "k2"; $food["b"]= "k3"; foreach($food as $key1=>$key2){ if(in_array("y",array_keys($key2))) unset($food[$key1]); } ?>

    • 締切済み
    • PHP
  • 連想配列のキー値(連番)を基に、別の配列を作るには?

    下記のように、キー値の一部に連番を持った連想配列 があるのですが、このキー値と連番で別の配列を 簡単に作る方法は無いでしょうか? もとの配列 $ary = array("item0"=>"x","item1"=>"y","item2"=>"z","data0"=>"o","data1"=>"p","data2"=>"q"); 上の$aryから $item=array([0]=>"x",[1]=>"y",[2]=>"z"); $data=array([0]=>"o",[1]=>"p",[2]=>"q"); のような形の配列を得たいのです。 foreach($ary as $key => $val){ } の構文で、$key値を調べて分断し、新しい配列に pushしていくしかないでしょうか? ※PHP4.3です

    • ベストアンサー
    • PHP
  • PHPコードの読解お願いいたします

    PHP初心者です。 環境→XAMPP1.7.0でアパッチなど一括ダウンロード OSはヴィスタ 以下コード中分からない点がありますので、ご指導よろしくお願いいたします。(細かい点は省略しています) なお●の部分が分からない点です。 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ <?php $city=array("東京""大阪""名古屋""神奈川") ?> <h2>出発地のご案内</h2> <form> <select name="city"> <?php foreach($city as $name=>$value){  ● print "<option value={$value}>{$value}</option> } ?> ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ●・・foreach内の$nameと$valueの変数はそれぞれ何を表わしているのでしょうか。 私の教科書的理解で申しますと、$nameはキー用の変数を表わし、$valueは値用の変数を表すものだと思っております。 そこから考えると、$cityに格納されている”東京"、"大阪"、"名古屋"、"神奈川”それぞれの文字列はキー用の$nameに格納される、なら残った$valueには何が入るのでしょうか。 そもそもforeach($配列名 as $キー用の変数=>$値用の変数)という記載の仕方ができるのは、事前に配列にて 例えば$配列名=array("キー0"=>値0、"キー1"=>値1・・) といった記載がされている場合に有効なのではないかと思うのですが。 繰り返しますが、おそらく$cityに格納されているそれぞれの文字列がキー変数を表わす"$name"に代入されると思うのですが、それでは値用の変数$valueにはいったい何が格納されるといういうのでしょうか。 どうぞよろしくお願いいたします。

    • ベストアンサー
    • PHP
  • php配列確認に関して

    $name = array( '0' => 'test', '1' => 'test1', '2' => 'test2', '3' => 'test4', '4' => array( '0' => 'e', '1' => 'r', '2' => 'y', '3' => 'i', ), ); foreach ($name as $key => $value) } print $value; } このうえの配列を確認したいのですが print $value;でやると 4がarrayとなってしまいます 4の中身を確認したいのですか foreachの下に何を書けばいいでしょうか?

    • ベストアンサー
    • PHP
  • 不要な配列を消したい

    2次元配列で、不要な要素を取り除きたいのですが良い方法が思い浮かばず、どうしたものかと悩んでいます。 一番初めと5番目を消したいのですが、preg_match で日付の2006にマッチしない要素をunsetしてみましたがうまくいきませんでした。 $data = array ( array('<br>'), array("2006 03 22", test), array("2006 03 23", test2), array("2006 03 25", test3), array('') ); $pattern = '/2006/'; foreach($data as $key => $value) { if(preg_match($pattern, $value[$key])) { unset($data[$key]); } } もし方法をご存知のかたおられましたらよろしくお願いいたします。

    • ベストアンサー
    • PHP
  • PHP SimpleXml unsetについて

    SimpleXMLにて特定のノードを検索し、検索結果を削除しようとしています。 まず、下記ソースコードの「削除1」を行っていたのですが、 $xmlから検索結果が削除されず「削除2」に修正したところ正常に削除されるようになりました。 「削除1」と「削除2」は検索結果をforeachで直接使用しているか、 一度変数にセットして利用するかの違いなのですが、 なぜ変数に検索結果をセットするとunsetで削除されなくなるのかわかりません。 PHP初心者でして、初歩的な質問かと思いますが、どなたか教えていただけないでしょうか? 宜しくお願い致します。 -------------------------------------------- $xml = new SimpleXMLElement($filepath, null, true); // 削除1 $items = $xml->xpath($name . '[' . $column . '="' . $value . '"]'); foreach( $items as $item ) { unset($item); $ret ++; } // 削除2 foreach( $xml->xpath($name . '[' . $column . '="' . $value . '"]') as $item ) { unset($item[0]); $ret ++; } file_put_contents($filepath, $xml->asXML());

    • ベストアンサー
    • PHP
  • PHP 変数の書き方

    初歩的な質問で恐縮なのですが どなたか教えていただけますでしょうか。 変数の書き方で $a="banana"; $$a = 1; print $$a; とした場合にちゃんと出力結果は「1」と出るのですか プログラムの書き方として上記のように$$を続けて書くのは正しいのでしょうか。 例えば配列を使った場合 $a = array("banana"=>0); このbananaを変数名としたい場合 bananaをforeachなどで取り出し $keyとし $$key = 1; print $$key; この書き方はプログラムの書き方として正しいのでしょうか?他によいか書き方ある場合その書き方を教えていただければ幸いです。 よろしくお願い致します。

    • ベストアンサー
    • PHP

専門家に質問してみよう