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

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

新規登録して質問してみよう
ただいま回答率
85.50%
PHP

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

Q&A

解決済

3回答

1701閲覧

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

pegy

総合スコア243

PHP

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

0グッド

0クリップ

投稿2017/11/02 07:07

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

PHP

1$ary=[[1,2,3,INF],[1,2,3,NAN]],[1,2,3,4]]; 2 3foreach ($ary as &$key) { 4 if (is_infinite($key[4])) { 5 unset($key); 6 } 7} 8unset($key)//参照を解除

気になる質問をクリップする

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

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

PHP

1$a1=[ 2 [1,2,3,INF], 3 [1,2,3,NAN], 4 [1,2,3,4], 5 [1,INF,INF,4], 6 [1,NAN,NAN,4], 7 ]; 8 9for($i=count($a1)-1;$i>=0;$i--){ 10 $a2=$a1[$i]; 11 for($j=count($a2)-1;$j>=0;$j--) { 12 if(is_infinite($a2[$j])) unset($a1[$i]); 13 } 14}

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

PHP

1$a1=[ 2 [1,2,3,INF], 3 [1,2,3,NAN], 4 [1,2,3,4], 5 [1,INF,INF,4], 6 [1,NAN,NAN,4], 7 ]; 8 9for($i=count($a1)-1;$i>=0;$i--){ 10 $a2=$a1[$i]; 11 for($j=count($a2)-1;$j>=0;$j--) { 12 if(is_infinite($a2[$j])) unset($a1[$i][$j]); 13 } 14}

投稿2017/11/02 07:35

編集2017/11/02 07:36
yambejp

総合スコア114581

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

maisumakun

2017/11/02 07:36

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

2017/11/02 07:37

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

2017/11/02 07:38

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

2017/11/02 07:44

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

2017/11/02 07:53

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

0

ベストアンサー

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

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

php

1$ary=[[1,2,3,INF],[1,2,3,NAN]],[1,2,3,4]]; 2 3$newAry = array_filter($ary, function($key){ 4 return !is_infinite($key[3]); 5});

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

投稿2017/11/02 07:16

maisumakun

総合スコア145121

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

maisumakun

2017/11/02 07:19

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

2017/11/02 07:29

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

0

PHP

1 2// $ary=[[1,2,3,INF],[1,2,3,NAN]],[1,2,3,4]]; 3// ↑ 4 $ary=[[1,2,3,INF],[1,2,3,NAN],[1,2,3,4]]; 5 6foreach ($ary as $i => &$key) { 7 if (is_infinite($key[3])) { // 4は無い0,1,2,3番目のいずれかで 8 unset($ary[$i]); 9 } 10} 11unset($key);//参照を解除 12var_dump($ary); 13/* 14array(2) { 15 [1]=>array(4) { 16 [0]=>int(1) 17 [1]=>int(2) 18 [2]=>int(3) 19 [3]=>float(NAN) 20 } 21 [2]=>array(4) { 22 [0]=>int(1) 23 [1]=>int(2) 24 [2]=>int(3) 25 [3]=>int(4) 26 } 27} 28*/

投稿2017/11/02 07:24

kei344

総合スコア69364

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

pegy

2017/11/02 07:37

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問