質問をすることでしか得られない、回答やアドバイスがある。

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

ただいまの
回答率

91.01%

  • PHP

    17779questions

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

is_infinite($hoge)で特定の配列をunsetする方法

解決済

回答 3

投稿

  • 評価
  • クリップ 0
  • VIEW 140

pegy

score 54

下記のように、$ary[0][4]がINFなので、これだけを削除して、
$ary[0]=[1,2,3,NAN]],[1,2,3,4]]]としたいのですが、unsetでは動作してくれません。
unsetをこのようには使用できないのでしょうか?また他に特定の配列をforeachで削除可能でしょうか?

$ary=[[1,2,3,INF],[1,2,3,NAN]],[1,2,3,4]];

foreach ($ary as &$key) {
  if (is_infinite($key[4])) {
    unset($key);
  }
}
unset($key)//参照を解除
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

+3

INFを含む配列毎削除したいのでしょうか?

$a1=[
  [1,2,3,INF],
  [1,2,3,NAN],
  [1,2,3,4],
  [1,INF,INF,4],
  [1,NAN,NAN,4],
  ];

for($i=count($a1)-1;$i>=0;$i--){
  $a2=$a1[$i];
  for($j=count($a2)-1;$j>=0;$j--) {
    if(is_infinite($a2[$j])) unset($a1[$i]);
  }
}

それともその項目だけ削除なのでしょうか?

$a1=[
  [1,2,3,INF],
  [1,2,3,NAN],
  [1,2,3,4],
  [1,INF,INF,4],
  [1,NAN,NAN,4],
  ];

for($i=count($a1)-1;$i>=0;$i--){
  $a2=$a1[$i];
  for($j=count($a2)-1;$j>=0;$j--) {
    if(is_infinite($a2[$j])) unset($a1[$i][$j]);
  }
}

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/11/02 16:36

    あれ、別な質問に回答しようとして間違えていません?

    キャンセル

  • 2017/11/02 16:37

    例のバグです。更新したらなおりました

    キャンセル

  • 2017/11/02 16:38

    「真っ白回答」とか、時々発生しますけど、なんとかしてほしいですよね…(回答には無関係なのでこれぐらいで)

    キャンセル

  • 2017/11/02 16:44

    投稿してすぐ気がついて直したんですが、見つかっちゃいましたね(苦笑)

    キャンセル

  • 2017/11/02 16:53

    コメント有難うございます。
    皆様、そんなに早く新着の質問をご覧頂いているのですね。。。おかげさまで質問者の我々もタイムリーに解決ができて、皆様とteratail様様です。。
    さて、配列自体の削除なので上記になります。for文でunsetするケースですね。

    キャンセル

checkベストアンサー

+2

forforeachを回しながら、その配列から削除していく」というのは、「0番目を削除→次に参照する1番目はもとの2番めとなって、もとの1番目は処理されないまま」というように順番が飛んだりすることもあるので、よほど挙動をしっかり抑えなければやってはいけません

array_filterという専用の関数がありますので、それを使いましょう(PHPマニュアル)。

$ary=[[1,2,3,INF],[1,2,3,NAN]],[1,2,3,4]];

$newAry = array_filter($ary, function($key){
  return !is_infinite($key[3]);
});

なお、配列の添字は0から始まりますので、[3]で正しいです。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/11/02 16:19

    !is_infiniteもくどいとは思いますが、NANについてはis_finiteもis_infiniteもfalseということで、そのまま行くしかない感じでした。

    キャンセル

  • 2017/11/02 16:29

    コメント有難うございます。
    なるほど、確かにループ中に配列が削除されていくような場合、仰るような処理も感覚的に理解はできました。また、添え字については失礼致しました。

    キャンセル

0

// $ary=[[1,2,3,INF],[1,2,3,NAN]],[1,2,3,4]];
//                            ↑
   $ary=[[1,2,3,INF],[1,2,3,NAN],[1,2,3,4]];

foreach ($ary as $i => &$key) {
  if (is_infinite($key[3])) { // 4は無い0,1,2,3番目のいずれかで
    unset($ary[$i]);
  }
}
unset($key);//参照を解除
var_dump($ary);
/*
array(2) {
  [1]=>array(4) {
    [0]=>int(1)
    [1]=>int(2)
    [2]=>int(3)
    [3]=>float(NAN)
  }
  [2]=>array(4) {
    [0]=>int(1)
    [1]=>int(2)
    [2]=>int(3)
    [3]=>int(4)
  }
}
*/

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/11/02 16:37

    コメント有難うございます。
    maisumakun様が仰るようにループの仕組みを正確に知らばければ、と痛感いたしました
    元の配列 as 添字=>要素 でforeachを回す場合で、元の配列[添字]であれば、unsetで一部の配列を削除してもphpは正しくループしてくれるのですで。この構造も詳細を調べてみようと思います。

    キャンセル

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

  • ただいまの回答率 91.01%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • PHP

    17779questions

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