配列IF()の問題について

このQ&Aのポイント
  • 配列IF()を使用しているときに、-1が連続して入った場合の解決方法について質問です。
  • 現在の式では、配列に-1が二つ入ると正しく動作しなくなってしまいます。
  • 連続して-1が入った場合の解決策も教えていただきたいです。
回答を見る
  • ベストアンサー

配列IF()について質問です。

$bad = -1; $bad2 = array_search($bad,$king_array); if($bad2==""){ echo "こんばんわ"; }else{ if($king_array[$bad2-1]!==-1 and $king_array[$bad2]==-1){ $king_array[$bad2] = ($king_array[$bad2-1]+$king_array[$bad2+1])/2; }else{ echo "おはよう"; }}} 現在こんな感じで、配列に-1が有れば、代入する式を書いています。 しかし、これだと配列に-1が二つ入る(例:80,-1,60,-1,50)と上記の式を実行してくれなくなります。 これを解決するにはどうすれば良いですか?? 他にも-1が連続で二つ入った場合はどうすれば良いですか??

  • PHP
  • 回答数3
  • ありがとう数2

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

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

おそらくこんなことがやりたい? <?PHP $king_array=array(100,-1,-1,-1,60,59,58,-1,50,-1,-1,20); $tmp=$king_array; foreach($tmp as $key=>$val){ if($val==-1) unset($tmp[$key]); } $pre_key=null; foreach($tmp as $key=>$val){ if(is_null($pre_key)){$pre_key=$key;continue;} for($i=1;$i<$key-$pre_key;$i++){ $king_array[$pre_key+$i]=$tmp[$pre_key] - ($tmp[$pre_key]-$val)/($key-$pre_key) * $i; } $pre_key=$key; } print_r($king_array); ?>

drmada
質問者

補足

まさに私がやりたい事ができました。大先生と呼ばせて頂きたいくらい感謝します!

その他の回答 (2)

  • shimix
  • ベストアンサー率54% (865/1590)
回答No.2

配列を書き替えているなら、array_searchの戻り値がfalseになるまでwhileでLoopさせればいいだけじゃないの? というか、以前(複数存在する可能性があるなら)array_keysで第二引数を指定すればいいのでは?って書いて、無視されたんだけどww

drmada
質問者

お礼

せっかちなのでお礼し忘れる事が多々あります。

  • t_ohta
  • ベストアンサー率38% (5085/13290)
回答No.1

array_search を使わずに foreach を使って処理した方がいいんじゃないですか。

drmada
質問者

お礼

ありがとうございます。試してみます。

関連するQ&A

  • 荒らしは無視でお願いします。私は真剣です。

    //$king_array()には80,60,-1,70が入ってます。 $king_array(80,60,-1,70) //$bad は -1です $bad = -1; //$king_arrayの何番目に$bad が有るか調べます。 $bad2 = array_search($bad,$king_array); //配列の中の-1の前が-1では無く尚且つ配列の二番目が-1である時、配列の二番目は-1がある値の前後を足し、割った数値である。 if($king_array[$bad2-1]!==-1 and $king_array[$bad2]==-1){ $king_array[$bad2] = ($king_array=$bad2-1+$king_array=$bad2+1)/2; } このようにしたいのですが、 Cannot use a scalar value as an array とエラーが出ます。どうしたら良いですか(T0T)??

    • ベストアンサー
    • PHP
  • 配列の添え字が小数だとどうなる?

    ある書籍の検索アルゴリズムの2分検索の説明で、下記のような例が示されていました。 (これはその例を私がプログラム化したのもので、書籍からの転写ではありません。) そこで疑問なんですが、このプログラムは確かに動作こそしますが、 ループの中の$middleは小数になりますよね。 添え字が小数になる事は、正しい配列の処理といえるのでしょうか? 小数に対して、丸めるなどの処理を加えるべきなのでしょうか? よろしくお願いします。 ------------------------------------------------------------ 「$arrayの中から、$xを検索します」 $array = array(1,2,3,4,5,7,10,12); $x = 10; $low = 1; $high = count($array); $is_exist = false; while( $low <= $high and $is_exist == false ) { $middle = ( $low+$high )/2; if( $array[$middle] == $x ) { $is_exist = true; } else if ( $array[$middle] < $x ) { $low = $middle+1; } else if ( $array[$middle] > $x ) { $high = $middle-1; } } if ($is_exist) { echo "true"; } else { echo "false"; }

    • ベストアンサー
    • PHP
  • 配列のループ展開

    下記で配列内を検索しても、「存在しません」になります。 どこが、間違っているのでしょうか? <?php for($i = 1; $i <= 42; $i++) { $seminar = "http://www.hoge.com/hoge/".sprintf("%04d", $i).".html"; echo $seminar; } $url = array( $seminar ); $myUrl = "http://www.hoge.com/hoge/0020.html"; if(in_array($myUrl, $url)){ echo "配列に".$myUrl."は存在します。"; } else { echo "配列に".$myUrl."は存在しません。"; } ?>

    • ベストアンサー
    • PHP
  • if文がifにならない?

    よろしくお願いします。 連続投稿防止の為に、getenvで取得したIPアドレスと time()で取得した時間をcsvファイルに xxx.xxx.xxx.xxx<>1249494949 xxx.xxx.xxx.xxx<>1249494949 という風に記述をしてます。 具体的には、 <?php $ipdesu = "./ip.csv"; $ipgetdesu = getenv( "REMOTE_ADDR"); $times = time(); $hoge = 0; $roop_open = fopen( $ipdesu, "r"); while(! feof($roop_open)){ $roop_get = fgets( $roop_open); $roop_ex = explode( "<>", $roop_get); $hogehoge = $hoge++; //IPチェック if( in_array( $ipgetdesu, $roop_ex)){ echo "配列検索TRUE"; //時間チェック if ( "60" < $times - $roop_ex[1]){ $fp = file( $ipdesu); unset( $fp[$hogehoge]); $fp_open = fopen( $ipdesu, "w"); foreach ( $fp as $value){ fputs( $fp_open, $value); } fclose( $fp_open); }else{ echo "連投規制"; } }else{ $fal_open = fopen( $ipdesu, "a"); fputs( $fal_open, $ipgetdesu."<>".time()."\n"); fclose( $fal_open); echo "配列検索FALSE"; } } fclose( $roop_open); ?> と記述しています。 <まだ、始めたばかりなのでロック制限とかしてませんがそこはご勘弁を 上記を実行すると、if ここ else そこ の本来、真であれば「ここ」が 偽であれば「そこ」だけが実行されると思っていたのですが、 上記の実行結果は、「ここ」も「そこ」も実行されてしまい かつ、IPを記述したファイルの検索が2回め実行した時に 同じIP 127.0.0.1<>時間 127.0.0.1<>時間 とローカルで試してるのでIPが変更になるはずないのですが(DHCPは念の為しようしていません in_arrayでヒットしないのは何故でしょうか? また、ifが正しく動作しないのは多重ifとでも言えばいいのでしょうか? が悪いからでしょうか。 つたないソースで申し訳ないですが、どうかよろしくお願いします。

    • ベストアンサー
    • PHP
  • 配列の何番目かを出力したい

    配列(80,-1,50,40) $ba = -1 $ba2 = array_search($ba,配列) echo array[$ba2-1]; この出力結果を0にしたいのに0番目の80が出ます。 どうすれば、並び番号を出力できますか??

    • ベストアンサー
    • PHP
  • 配列

    最後にもう一つだけお願いします。ずっと格闘しても解決できません・・ 配列の中の数字で、偶数を全て奇数の前にもって行きます 例) {1,0,1,0,0,1,1} → {0,0,0,1,1,1,1} {3,3,2} → {2,3,3} {2,2,2} → {2,2,2} 流れとしては、まず奇数の数を数えます。これは何回シフトするから知るためです。 配列0から奇数を探し、あればそれを一番最後の配列へとシフトします。 奇数を探す作業が一度終わっても、まだシフトさせないといけない奇数があるかもしれないので(奇数が連続で並んでる場合)、最初に数えた奇数の数分だけちゃんとシフトするようにしようと思います。 public void evensLeft(int[] array) { int odd=0; for (int i = 0; i < array.length; i++) { if(array[i]%2!=0) odd++; //奇数の個数 } while (odd>0) { //奇数分シフトするためのカウント for(int j=0;j<array.length;j++){ //奇数を探す if (array[j] % 2 != 0) { odd--; //奇数のカウントを1減らす for (int k = j; k < array.length-1; k++) { //その奇数を一番最後に移動 int temp = array[k+1]; array[k+1] = array[k]; array[k] = temp; } } } } return array; } いくつかの例では動くのですが、{3,3,2}の例だと配列0に3が来てしまいます。色々変えてみても結果無理でした・・・ どなたかご教授お願いします。

    • ベストアンサー
    • Java
  • 多次元配列?配列のキー?変数の型?

    PHP勉強中のものです。 予定通りの動作にならんく四苦八苦しています。 どのように修正すれば予定通りになるのか考え方のアドバイスなどお願いします。 処理したいこと 変数$xxxの先頭の文字と最後の文字をsubstr()で取り出し$aaaと$bbbに別けそれぞれ代入しキーとして多次元配列に代入した配列要素を指定してechoで出力したい 試してみたこと $aaa1と$bbb1に直接整数を代入してみたところ、echoで出力された キーになる変数を整数型として変数に代入してみたが希望通りの動作にならなかった。 なにかアドバイス頂けると助かります。 $array = array( "0" =>array("あいうえお","かきくけこ"), "1" =>array("さしすせそ") ); $xxx = "0-1"; $aaa = substr($xxx,0,1); $bbb = substr($xxx,2); $aaa = (int)$aaa; $bbb = (int)$bbb; echo $array[$aaa][$bbb]; //出力されない $aaa1 = 0; $bbb1 = 1; echo $array[$aaa1][$bbb1]; //出力された $aaa = (int)$aaa; $bbb = (int)$bbb; echo $array[$aaa][$bbb]; //出力されない

    • ベストアンサー
    • PHP
  • JAVAの配列関連

    java の配列について質問があります。 わかりそうでわからない、というところであります。 【質問】 以下のような要素数の不明な配列を1つの文字列にする場合 どの様に処理したら良いのでしょうか。 ただし、array には何らかの文字列が既に入っているとします。 (どのように for 文などでくくれば、上手く出来るでしょうか。) ArrayList<String> array = new ArrayList<String>(); int size = array.size(); String str = null; if(size == 0){    str = (array.get(0)); } else if(size == 1){    str = (array.get(0) + "," + array.get(1)); } else if(size == 2){    str = (array.get(0) + "," + array.get(1) + "," + array.get(2)); } else if(size == 3){    str = (array.get(0) + "," + array.get(1) + "," + array.get(2) + "," + array.get(3)); } else if(size == 4){    str = (array.get(0) + "," + array.get(1) + "," + array.get(2) + "," + array.get(3) + "," + array.get(4)); }・・・ この if文 の部分を for文 ですっきりさせたいのですが どうにも思いつきません。 ご存知の方いらっしゃいましたら お力添えをお願いいたします。

    • ベストアンサー
    • Java
  • PHP「FALSE」や「0」を使った条件文

    「if条件文」の()に「FALSE」や値「0」がはいると なにも考える事無く無条件に 「else」以降の条件が実行になるという決まりなのでしょうか? もしそうであれば条件分にする意味があるのでしょうか? 基本的な質問で申し訳ないのですが 実際に使われる分かりやすい簡単な例があれば ご紹介ください。 よろしくお願いいたします。 例1: if(FALSE){ echo "FALSEではない"; }else{ echo "FALSEです。"; } 例2: if(0){ echo "ゼロではない"; }else{ echo "ゼロです。"; } 例3:(特にこの例は何かおかしいような気がします) if(10-10){ echo "イフが実行"; }else{ echo "エルスが実行"; }

    • ベストアンサー
    • PHP
  • 空の配列を示す方法

    Flash8を使用して、ActionScript2を書いています。 if文を用いて、「変数my_array(配列)が空の配列でない場合は~」 という条件分岐を書きたいのですが、 空の配列を示す方法がわかりません。 var my_array:Array = new Array(); とした上で、 if (my_array == null) { trace("null"); } else { trace("違う"); } と書いて調べてみたのですが、 nullでもundefinedでも""でも[]でも「違う」と表示されてしまいます。 「空の配列でない場合」という条件を書く方法はあるでしょうか?

    • ベストアンサー
    • Flash