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

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

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

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

3回答

2365閲覧

[PHP]要素に空白があった場合にVar_dumpに出力させない

maguroyamiy

総合スコア12

PHP

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

1クリップ

投稿2016/08/02 08:04

編集2016/08/02 08:43

###前提・実現したいこと
初心者です。
PHPでgoutteを使ってスクレイピングをしています。

サイトから上位20人の名前と時間を取得しています。
全てが記載されているわけではなく空白もあります。

そこで題の通り、取得してきた名前と時間の両方が空(無し)だった場合、
画像のようにarray[]=>から消したいのです。
正確に言えば、空欄があれば配列に出さない でしょうか。

まだ不慣れですがよろしくお願いします。

イメージ説明
###該当のソースコード

for ($i = 0; $i < 20; $i++){ //名 $name = $crawler->Filter('tbody')->Filter('tr')->eq($i)->Filter('td')->eq(0)->text(); //時間 $time = $crawler->Filter('tbody')->Filter('tr')->eq($i)->Filter('td')->eq(3)->text(); $list[] = array(array(trim($name),trim($time)) ); } echo var_dump($list);

###追伸
trimで空白を消してから配列にしているのですが、
「文字が無い場合」('')を非表示に出来ませんか?

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

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

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

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

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

kei344

2016/08/02 08:35

コードはコードブロックで囲んでいただけませんか? ```(バッククオート3つ)で囲み、前後に改行をいれるか、コードを選択して「</>」ボタンを押すとコードブロックになります。
guest

回答3

0

空白が半角であることを前提で。

php

1 2for ($i = 0; $i < 20; $i++) { 3 4 //名 5 $name = $crawler->Filter('tbody')->Filter('tr')->eq($i)->Filter('td')->eq(0)->text(); 6 7 //時間 8 $time = $crawler->Filter('tbody')->Filter('tr')->eq($i)->Filter('td')->eq(3)->text(); 9 10 if (!empty(trim($name)) && !empty(trim($time))) { 11 $list[] = array( 12 array( 13 $name 14 , $time 15 ) 16 ); 17 } 18}

投稿2016/08/02 08:09

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

0

マルチポスト


コード若干変わってるみたいなので書き直しますね

php

1$list = $crawler->filterXPath('//tr[ 2 position() <= 20 and 3 normalize-space(.//td[1]) != "" and 4 normalize-space(.//td[4]) != "" 5]')->each(function ($tr) { 6 return [ 7 trim($tr->filter('td')->eq(0)->text()), 8 trim($tr->filter('td')->eq(3)->text()), 9 ]; 10}); 11 12var_dump($list);

補足

(冗長なので勝手に修正しましたが) もし希望されているように2重の配列構造がよければ,以下のようにします.

php

1$list = $crawler->filterXPath('//tr[ 2 position() <= 20 and 3 normalize-space(.//td[1]) != "" and 4 normalize-space(.//td[4]) != "" 5]')->each(function ($tr) { 6 return [[ 7 trim($tr->filter('td')->eq(0)->text()), 8 trim($tr->filter('td')->eq(3)->text()), 9 ]]; 10}); 11 12var_dump($list);

なお,

上記で提示されているプルリクエストが採用されれば,今後以下のように書けるようになる可能性があります.

php

1$list = $crawler->filterXPath('//tr[ 2 position() <= 20 and 3 normalize-space(.//td[1]) != "" and 4 normalize-space(.//td[4]) != "" 5]')->each(function ($tr) { 6 return [ 7 $tr->evaluate('normalize-space(.//td[1])')[0], 8 $tr->evaluate('normalize-space(.//td[4])')[0], 9 ]; 10}); 11 12var_dump($list);

投稿2016/08/02 08:37

編集2016/08/02 10:00
mpyw

総合スコア5223

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

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

0

ベストアンサー

$listを得た後フィルターしてください

PHP

1var_dump(array_filter($list,function($a){ 2 $pattern="/^ *$/"; 3 if(preg_match($pattern,$a[0]) and preg_match($pattern,$a[1])){ 4 return false; 5 }else{ 6 return true; 7 } 8}) 9);

どちらかが空白だけの場合は上記、両方とも空白だけの場合はpreg_matchの間をorにしてください

修正

すみません、構造を見間違えていました

PHP

1var_dump(array_filter($list,function($a){ 2 $pattern="/^ *$/"; 3 if(preg_match($pattern,$a[0][0]) and preg_match($pattern,$a[0][1])){ 4 return false; 5 }else{ 6 return true; 7 } 8}) 9);

追記

抜け番を埋めるのはarray_merge()がよく使われます。
一度別の配列にうけてください

PHP

1$mylist=array_filter($list,function($a){ 2 $pattern="/^ *$/"; 3 if(preg_match($pattern,$a[0][0]) and preg_match($pattern,$a[0][1])){ 4 return false; 5 }else{ 6 return true; 7 } 8}); 9$mylist=array_merge($mylist); 10var_dump($mylist);

投稿2016/08/02 08:36

編集2016/08/02 11:40
yambejp

総合スコア114572

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

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

maguroyamiy

2016/08/02 09:00

Warning: preg_match() expects parameter 2 to be string, array given in と表示されてしまいました。
yambejp

2016/08/02 09:08

すみません、修正しました
maguroyamiy

2016/08/02 09:41

無事に非表示に出来ました! ただ番号が飛び飛びな状態なので詰めてしまいたいのですが、 array_valuesを使って可能でしょうか?
yambejp

2016/08/02 11:39

あら、抜け番を希望しているのかと思いました。 修正を上げておきます
mpyw

2016/08/02 11:53

>> 抜け番を埋めるのはarray_merge()がよく使われます。 いやいやarray_valuesでしょう… (array_mergeは用途が違いますがarray_valuesはそれ専用の関数です)
mpyw

2016/08/02 12:27 編集

【どちらかが埋まっていれば残す (1)】 $list = array_values(array_filter($list, function ($a) {     return !empty(array_filter(array_map('trim', $a[0]), 'strlen')); })); 【どちらかが埋まっていれば残す (2)】 $list = array_values(array_filter($list, function ($a) {     return !empty(preg_grep('/\A\s*\z/', $a[0], PREG_GREP_INVERT)); })); 【両方が埋まっている場合のみ残す】 $list = array_values(array_filter($list, function ($a) {     return empty(preg_grep('/\A\s*\z/', $a[0])); }));
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問