PHPで配列の値が意図せず変わる問題について考察

このQ&Aのポイント
  • PHPのバージョンが4の環境で、配列の値が意図せず変わる現象に困っています。
  • forループまたはforeachループを使用して配列の要素を変更したいと思っていますが、出力結果が期待通りになりません。
  • 配列の要素に先頭に「a」を付加すると、予期しない値になる問題が発生しています。原因や対処法について調査していますが、解決には至っていません。
回答を見る
  • ベストアンサー

phpで、配列の値が意図せず変わってしまいます。

環境はphp4です。 for、もしくはforeachを使って配列の中身を変えたいと思っています。 $array1 = array(123csv, 456csv, 789csv); for($a = 0; $a <= count($array1) -1; $a++){ $array2[] = "a" . $array1[$a]; } echo $array1[0]; echo $array2[0]; 上記の出力結果がなぜか異なり困っています。 array1[0]は「123csv」、 array2[0]は「a113csv」、もしくは「a12300v」 などとなってしまいます。 先頭に「a」を付加しない場合も「113csv」、もしくは「12300v」という結果です。 ちなみに$array1はexplodeを使って空白文字をを分割して作成した配列です。 これなバグなのでしょうか。 原因、回避策など、いろいろ調べましたが検討がつきません。 よろしくお願いします。

  • PHP
  • 回答数1
  • ありがとう数1

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

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

見た感じとくに問題なさそうですが・・・ ここに記述した別のところに問題があるのかも <?PHP $array1 = explode(" ","123csv 456csv 789csv"); for($a = 0; $a < count($array1); $a++){ $array2[] = "a".$array1[$a]; } echo $array1[0]."<br>"; echo $array2[0]."<br>"; ?>

koby_2011
質問者

お礼

ありがとうございます。 他のところを注意深く観察したら原因がわかりました。 どうにもハマって視野が狭くなってたみたいです。 説明しづらいですが、別の箇所での型の問題でした。 arrayのつもりがstringになってるのに気づかなかったようです。 すばやい回答ありがとうございましたm(__)m

関連するQ&A

  • 配列の値を集めた1つの文字列として取得するには

    Array ( [0] => a [1] => あ [2] => 123 [3] => 55 ) この配列を "a","あ","123","55" といった1つの文字列として取得したいです。 <?php $list = array("a","あ","123",55); $r = ""; for($i=0; $i<count($list); $i++){ $r .= ',"'.$list[$i].'"'; } $r = substr($r,1); echo $r; ?> このような形でできましたが、もっと良い方法はありますか? そして上の方法で良い場合は、下の1~4のどれが一番適切ですか? [1] for($i=0; $i<count($list); $i++){ $r .= ",\"".$list[$i]."\""; } [2] for($i=0; $i<count($list); $i++){ $r .= ',"'.$list[$i].'"'; } [3] foreach($list as $key => $val){ $r .= ",\"".$val."\""; } [4] foreach($list as $key => $val){ $r .= ',"'.$list[$i].'"'; }

    • 締切済み
    • PHP
  • phpのセレクトボックスの配列について

    お世話になっています。 PHPのセレクトボックスの設定でわからないことがあります。 一度質問させていただいたのですが連なる点でわからないとこが出たので質問させていただきます。 不明点は3つあります。 1.セレクトボックスの値を配列で設定する 配列で設定しておけばその配列を複数使用しても参照配列さえメンテすればいいと思うので配列を想定しています 2.配列で設定したときのセレクトボックスの初期値について セレクトボックスの値をベタ書きしている場合は単にselectedすればいいと思うのですが配列の場合厳密なselectedの方法が不明です 3.配列での選択値をPOSTした場合 3つめが最もはまっています以下のソースだと選択値が配列の値が表示されますし、初期値も表示できていますが POSTした値がまともに渡されていません POST先でDB処理を想定しているのですがdate型だとすべて[00:00:00]になってしまいます。 配列を使用しないパターンだと1.2.3全てうまくいくのですがメンテナンスがしづらいので配列で指定したいです 何か、良い方法があればご教授ください //配列の値 $time = array( "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23" ); $minute = array ("00", "15", "30", "45"); for( $a=0; $a < count( $time_array ); $a++){ $selectedStartTime =($time_array[$a] == $start_time[$j])?" selected":""; $startTimeSelectBox .= "\t<option value=\"{$time_array[$a]}\"{$selectedStartTime}>{$time_array[$a]}</option>\n"; } for($a=0; $a < count($minute_array); $a++){ $selectedStartMinute =($start_minute[$j] == $minute_array[$a])?" selected":""; $startMinuteSelectBox .="\<option value=\"{$minute_array[$a]} \"{$selectedStartMinute}>{$minute_array[$a]}</option>\n"; } <td><select name="start_time<?php echo $day ?>" onblur = "func()"> <?php echo $startTimeSelectBox ?> </select> : <select name="start_minute<?php echo $day ?>" onblur = "func()"> <?php echo $startMinuteSelectBox ?> </select> </td> かなり詰まっています。よろしくお願いします。

    • ベストアンサー
    • PHP
  • PHPの配列データの出力方法について

    CSVデータをインポート後に、array関数などで処理した後、 処理したデータを順次表示したいのですが、上手くいきません。 現在は、 foreach (func_get_args($csv_output) as $v) ; var_export($v); と記述しているのですが、これだとarrayが画面に出てしまいます。 print、echoだと表示が出来ず、 print_r、var_dumpだとvar_exportより少し多めに余計な表示が出てしまいます。

    • ベストアンサー
    • PHP
  • 配列にきちんと入れる方法

    txtの行数字が合っている数字だけ(7.6.4.1)抜いて上から順に配列に入れたいのですが、何か微妙に違う結果になります。 7 7 10 7 6 6 4 4 5 4 9 4 1 1 2 1 $abc=file("1.txt"); for($l=0;$l<count($abc);$l++){ $def=explode("\t",$abc[$l]); if($def[0]==$def[1]){ $ll=array($def[0]); print_r($ll); }} Array ( [0] => 7 [1] => 6 [2] => 4 [3] => 1 ) 上記のようなブラウザ結果にしたいのですが、別々に配列が表示されてしまいます。どう記述すればこの結果になるでしょうか?ご教授ください。

    • ベストアンサー
    • PHP
  • foreach のバグでしょうか。PHP 5.3.3 で悩んだところが

    foreach のバグでしょうか。PHP 5.3.3 で悩んだところがあります。 あるレコードが正規表現にマッチした場合、そのレコードに対して何らかの処理をするスクリプトを書いていました。 しかし思ったように動かず原因を調べました。結果、配列の値が変わっていることに気づきました。  ◇テスト用レコードの内容   http://www.yahoo.co.jp/   http://www.bing.com/   http://www.goo.ne.jp/   http://www.google.co.jp   http://d.hatena.ne.jp/  ◇先頭一致して欲しい文字列   http://www.google.co.jp/   http://www.bing.com/   http://www.youtube.com/  この場合、処理の対象は2件です。  私が書いたスクリプトでは3回マッチしてしまいます。  以下、テスト用に作ったスクリプトです。 <?php // URL のパターンを用意 (とりあえず以下の3パターン) $ar = array(); $ar['Google'] = array(  'URL' => 'http://www.google.co.jp/' ); $ar['Bing'] = array(  'URL' => 'http://www.bing.com/' ); $ar['YouTube'] = array(  'URL' => 'http://www.youtube.com/' ); // 先頭一致の正規表現にする foreach($ar as $key => &$value){  $value['regex'] = '/^' . preg_quote($value['URL'], '/') . '/'; } echo("URL の パターンを出力してみる/n"); print_r($ar); // テスト用 レコード $list = array(); $list[] = 'http://www.yahoo.co.jp/'; $list[] = 'http://www.bing.com/'; // match. $list[] = 'http://www.goo.ne.jp/'; $list[] = 'http://www.google.co.jp/'; // match. $list[] = 'http://d.hatena.ne.jp/'; // マッチするのは2回のみ...のはずが for($n = 0; $n < count($list); $n ++){  foreach($ar as $key => $value){   if(preg_match($value['regex'], $list[$n], $match)) echo("match.\n");  } } echo("もう一度 URL のパターンを出力してみる\n"); print_r($ar); echo("なぜか一番最後の配列の値が変わっている。\n"); ?>

    • ベストアンサー
    • PHP
  • 配列の初期化

    表題の件で質問があります。 //------------------------------------// $A_array = array("1", "2", "3"); $B_array = array("9", "8"); for($cnt=0;$cnt<count($A_array);$cnt++){ $test[] = $A_array[$cnt]; } for($cnt=0;$cnt<count($B_array);$cnt++){ $test[] = $B_array[$cnt]; } ※わかりやすいようの簡単に書いてみました。 //------------------------------------// 上記の処理の場合配列testには ("9", "8", "3")となってしまい、 ("9","8")のデータを取得できません。 簡単に言うと配列名を使いまわししたいと考えています。関数かなにかで配列の中身を初期化するような ものはありますでしょうか?

    • 締切済み
    • PHP
  • 配列の値の引渡し

    目的: 配列の値をフォームによりCSVに書き込みたい。 1.php 値入力 2.php 確認画面 for($i = 0;$i < count(@$_POST["q1"]); $i++){ echo "<p>" .$_POST["q1"][$i]; } として、1.phpで入力された値を表示 また、 <input type="hidden" name="q1[]" value="<? echo $q1[$i] ?>"> として、3.phpに値を引き渡すことをしているのですがうまくいきません。 3.php 完了画面 CSVに書き込み処理 アドバイスよろしくお願いします。

    • 締切済み
    • PHP
  • 配列内の値に

    preg_replaceで 配列内のスペースを<br>に置き換えてみたのですが期待しなかった結果がでたので、不思議に思い質問させていただきました。 <? //ケース1 $array[1] = "1 <br>"; $array[2] = "2 <br>"; $array[3] = "3 <br>"; $array[4] = "4 <br>"; $array[5] = "5 <br>"; $array[6] = "6 <br>"; print_r($array); ?> 上記のコードでは以下のように表示されるのですが、 Array ( [1] => 1 [2] => 2 [3] => 3 [4] => 4 [5] => 5 [6] => 6 ) <? //ケース2 $txt = "1 2 3 4 5 6 "; $array = explode(" ", $txt); $array = preg_replace ('/\s/', ' <br>', $txt); print_r($array); ?> ケース2では以下のように表示されます。 これはどうしてなのでしょうか? もしご存知の方おられましたらどうぞよろしくおねがいいたします。 1 2 3 4 5 6

    • ベストアンサー
    • PHP
  • 配列のカウント

    こんにちは 初歩的な質問だとは思うのですが…教えて下さい 【 1.以下のような配列を作る 】 $array = array( "1-aaa", "2-aaa", "2-bbb", "2-ccc" ); 【 2.本日の日付を取得 】 $today = date("d",time()); 【 3. arrayの件数分forで回す 】 for ($i = 0; $i < count($array); $i++) { 【 4.explodeで分解 】 $items = explode("*",$array[$i]); 【 5.日付と配列[0]が一致した時に項目表示 】 if($today == $items[0]){ print $items[1]; } という処理を行った時に if($today == $items[0]) に該当するデータ件数というのは 求めることが出来ないものなのでしょうか (今日が2日として、この場合は「3」が欲しい) 前からこういう状況下で該当する件数を求めたい時があっても どうしたらよいのかわからなくて諦めていたのです 絶対ムリなら諦めるので、出来るのかどうか教えて頂けますか?? もし可能であれば、求め方のヒントも頂けると助かります よろしくお願い致します!!

    • ベストアンサー
    • PHP
  • 配列の要素の値をループ中に変更して確認したいのですが、下記やり方では、

    配列の要素の値をループ中に変更して確認したいのですが、下記やり方では、なぜダメなのでしょうか? $arr = array("値1", "キー1" => "値2", "値3"); foreach($arr as $key => $val){ $arr[$key] = "-{$val}-"; echo $val."<br />"; } foreach($arr as $key => $val){ echo "<br />".$val; } 上のforeachの結果が、下と同じようになると期待したのですが、うまくいきません。 なんで、上のforeachと下のforeachの結果が異なるのでしょうか? foreach文で要素の値が更新されるのは、foreach文が終了した瞬間なのでしょうか。 それとも、値はすぐに更新されているけれども、foreach文の処理(順番に抽出する作業?)は既にスタートしてしまっているので、ループ中に更新されても、途中で反映することはできない、ということなのでしょうか? さっぱり分からないので、誰か教えてください。 「配列の要素の値をループ中に変更して確認したい」というよりは、 「なんで、二つのforeach文で結果が異なるか知りたい」です。

    • ベストアンサー
    • PHP