【ワレコのPHP】今日覚えたPHPの小技

この記事は約13分で読めます。
スポンサーリンク

今日、久しぶりにPHPでプログラミングをした。

Visual Studio 2017 Communityを使ってPHPのプログラムを書いたのだが、Visual Studioの場合、PHPの開発環境は標準では備わっていない。

つまり、エディタを使ってPHPでプログラムを書く事は出来るが、デバッガが利用出来ない。

Visual Studio 2017でPHPのデバッグを行う為には、他社製の有料製品をインストールする必要がある。

具体的には、以下の製品だ。

PHP Tools for Visual Studio Trial
DEVSENSE

https://marketplace.visualstudio.com/items?itemName=DEVSENSE.PHPToolsforVisualStudio

上のサイトを開くとダウンロードボタンがあるので簡単にダウンロードできる。

それをVisual Studio 2017にインストールすれば30日間は全機能をお試し利用できる。

その期間が切れるとデバッガが利用出来ないので、ブレークポイントを設定しても止まらない。

従って、PHPのデバッグは、echoやprint_rを多用するという超原始的な手法で行う必要がある。

なぜVisual Studioは未だに標準でPHPのデバッガなどを含む開発環境を統合しないのか分からない。

PythonならVisual Studioに標準でデバッガも付いていると言うのに。

では、今日ワテが覚えたPHPの小技を紹介しよう。

まあ、ワテの備忘録であるが。

スポンサーリンク
ワテ推薦のプログラミングスクールで学ぶ
スポンサーリンク
スポンサーリンク

指定したフォルダの中にあるファイルやフォルダの名前を全部取得する方法

以下のPHPを実行すると、カレントディレクトリにあるファイル名やフォルダ名を全部echoで書き出す。

<?php
if ($handle = opendir('.')) {
    while (false !== ($entry = readdir($handle))) {
        if ($entry != "." && $entry != "..") {
            echo "$entry\n";
        }
    }
    closedir($handle);
}
?>

引用元 http://php.net/manual/en/function.readdir.php

 

もし特定のフォルダに対して実行したい場合には、

opendir('.')

の部分にそのフォルダのパスを指定すれば良い。

なお、上のPHPコードでは、サブフォルダが存在してもそのサブフォルダの中を探索する事は無い。

もしサブフォルダの中も再帰的に探索したい場合には、そのような再帰処理をPHPで書く必要がある。

そのサンプルプログラムも上の引用元URLで示したPHP公式サイトにあるので参考にすると良いだろう。

セッション変数に配列を代入する方法

PHPのセッション変数に関しては、以前、この記事にまとめた。

【ワレコPHP講座】セッション変数、Cookieなど【状態変数を使う】
例えばWEBサイトを作成して利用者さんがWEBサイトを訪問したとする。その訪問期間中に何らかの情報を利用者とWEBサーバーの間で共有したい場合がある。そう言う状況は幾らでもある。一つの例を上げるとGoogleのサイトを開いて何らかのキーワー

セッション変数を使うと、クライアントサイドとサーバーサイドとの間でデータを共有できるので色々な応用が出来る。

例えば単純に文字列データをセッション変数に代入するなら以下のようにする。

$_SESSION['animals']= '文字列など';

 

今回は、セッション変数に文字列配列データを代入したい状況に遭遇した。

やり方が分からないので、キーワード

php session variable array

でGoogle検索したら以下のサイトがヒットした。

Page 7: Can I Store An Array In A Session? - An Introduction To PHP Sessions - PHP articles and PHP tutorials - PHP 5, MySQL, PostgreSQL, AJAX, Web 2.0
Page 7 Can I Store An Array In A Session This article is an introduction to using sessions in PHP.

このサイトを参考にすると、PHPセッション変数に配列を代入してその結果を読み出すには以下のようにすれば良い。

<?php
   // begin the session
   session_start();
 
   // create an array
   $my_array=array('cat', 'dog', 'mouse', 'bird', 'crocodile', 'wombat', 'koala', 'kangaroo');
 
   // put the array in a session variable
   $_SESSION['animals']=$my_array;
 
   // loop through the session array with foreach
   foreach($_SESSION['animals'] as $key=>$value)
   {
      // and print out the values
      echo 'The value of $_SESSION['."'".$key."'".'] is '."'".$value."'".' <br />';
   }

?>

その実行結果は以下のようになる。

The value of $_SESSION['0'] is 'cat'
The value of $_SESSION['1'] is 'dog'
The value of $_SESSION['2'] is 'mouse'
The value of $_SESSION['3'] is 'bird'
The value of $_SESSION['4'] is 'crocodile'
The value of $_SESSION['5'] is 'wombat'
The value of $_SESSION['6'] is 'koala'
The value of $_SESSION['7'] is 'kangaroo'

 

セッション変数に保管した配列データの中から特定要素を読み出したい場合

その場合には以下のようにすれば良い。

<?php
   // begin the session
   session_start();
 
   // echo a single member of the array
   echo $_SESSION['animals'][3];
?>

これを実行すると、第3要素(第0要素から数えるので順番では4番目の要素)の

 bird

が表示される。

セッション変数に保管した配列データを全部表示したい場合

echo '<pre>';
print_r($_SESSION['animals']);
echo '</pre>';

これで表示出来る。

その実行結果は以下の通り。

Array
(
 [0] => 'cat'
 [1] => 'dog'
 [2] => 'mouse'
 [3] => 'bird'
 [4] => 'crocodile'
 [5] => 'wombat'
 [6] => 'koala'
 [7] => 'kangaroo'
)

 

配列の先頭要素を取り出す方法

PHPの配列は連想配列なのだが、ワテの場合、未だにPHPの連想配列には馴染めない。

普通の配列のように数字のインデックスで array[i] などで参照できるほうが好きなのだが。

 

で、PHPで配列の先頭を取り出す方法を調べる為に、再びGoogle検索。キーワードは以下の通り。

php get first element of array

そしたら最初にヒットしたのが以下のサイト。

Get the first element of an array - Stack Overflow

 

幾つかの手法が紹介されている。

array_shift(array_values($array));

array_pop(array_reverse($array));

reset($array);

array_shift(array_slice($array, 0, 1)); 

array_values($array)[0];

引用元 スタックオーバーフローのサイト https://stackoverflow.com

ワテの場合、取り敢えずこの五つの手法の最後のヤツを試したら上手く行ったのでそれを利用した。

なぜこれで先頭要素が得られるのか、詳しい事は調べていない。

WordPressのショートコードでブーリアン型のパラメータを渡したい場合

ワテの場合、WordPressのショートコードを時々自作する。

WordPress関連は経験が浅いので、あまり複雑な処理を書く能力は未だ無いのだが、今日、ちょっとしたショートコードを書いた。

その時に、パラメータでブーリアン型のデータを渡したい状況に直面した。

それで、再びGoogle検索した。

キーワードは以下の通り。

wordpress shortcode pass boolean parameter 

 

そしてヒットしたのが以下のサイト。

Pass boolean value in shortcode

Pass boolean value in shortcode - WordPress Development Stack Exchange

stackexchangeと言うサイトなのだが、stackoverflowとよく似た作りだ。

両者の関係は知らない。

たぶん何か関係あるのかな?

さてその内容を引用させてもらうと以下の通り。

 

要するにブーリアン型のパラメータをショートコードで指定する場合は、文字列で与えるのだ。

[shortcode boolean_attribute='1'] or [shortcode boolean_attribute='0']
[shortcode boolean_attribute='false'] or [shortcode boolean_attribute='true']

このどちらのやり方でも良い。

一方、このショートコードの処理する側の関数では、以下のようにすれば良い。

add_shortcode( 'shortcode', 'shortcode_cb' );

function shortcode_cb( $atts ) {
  extract( shortcode_atts( array(
    'boolean_attribute' => 1
  ), $atts ) );
  if ( $boolean_attribute === 'false' ) $boolean_attribute = false; // just to be sure...
  $boolean_attribute = (bool) $boolean_attribute;
}

引用元 https://wordpress.stackexchange.com/questions/119294/pass-boolean-value-in-shortcode

このコードの意味であるが、引数$attsにはショートコードで与えた全パラメータが来る。

その中にはboolean_attributeも含まれる。

もしboolean_attributeが与えられていない場合には、デフォルト値として数字の 1 を与えている。

この時点で、$boolean_attribute変数の中身は、

‘0’
‘1’
‘true’
‘false’
1

のいずれかとなる。

ここで文字列 ‘false’ の場合には、ブーリアン型のfalseにしておく。

その後、boolにキャストしているが、これで

‘0’   =>  false
‘1’          =>  true
‘true’      =>  true
false      =>  false
1           =>  true

となるのかな。

たぶん。

その結果、無事にブーリアン型のパラメータを関数に渡す事が出来た。

正規表現の文字列置換で改行を含む文字列を処理する

例えば以下のような複数行に渡る文字列が変数 $lines に入っているとする。

<div id="content">
   <div class="target">
      このdivブロックを取り除きたい
   </div>
</div>

これを以下のようにしたい。

<div id="content">
   削除した
</div>

正規表現を使うとこんな感じか。

$lines2 = preg_replace('/<div class=\"target\">(.*)<\/div>/is','削除した',$lines);

 

i はignore caseか。

i (PCRE_CASELESS)
If this modifier is set, letters in the pattern match both upper and lower case letters.

引用元 http://php.net/manual/en/reference.pcre.pattern.modifiers.php

 

s はドット文字 . を改行文字にもマッチさせられるようにすると言う意味だ。

s (PCRE_DOTALL)
If this modifier is set, a dot metacharacter in the pattern matches all characters, including newlines. Without it, newlines are excluded. This modifier is equivalent to Perl’s /s modifier. A negative class such as [^a] always matches a newline character, independent of the setting of this modifier.

引用元 http://php.net/manual/en/reference.pcre.pattern.modifiers.php

 

まとめ

PHPは偶にしかプログラミングしないので、文法が中々覚えられない。

それにPHPのデバッガが利用出来ないので、ますますPHPプログラミングがやり辛い。

それと、いつも思うのだがPHPの文法は何だか知らないが妙な癖が有る感じがするのだ。

C, C++などの言語とは一味違う文法だと思う。

それを使い易いと思う人もいると思うのだが、ワテの場合PHPの文法には今一つ馴染めない。

例えば配列

array

PHP公式サイト

PHP: array - Manual

から引用すると、

例1 array() の例

<?php
   $fruits = array (
     "fruits" => array("a" => "orange", "b" => "banana", "c" => "apple"),
     "numbers" => array(1, 2, 3, 4, 5, 6),
     "holes" => array("first", 5 => "second", "third")
   );
?>

う~ん、なんか変だよなあ。

=> こんな記号が沢山出て来るし。

例2 array() における自動インデックス

<?php
   $array = array(1, 1, 1, 1, 1, 8 => 1, 4 => 1, 19, 3 => 13);
   print_r($array);
?>

上の例の出力は以下となります。

Array
(
 [0] => 1
 [1] => 1
 [2] => 1
 [3] => 13
 [4] => 1
 [8] => 1
 [9] => 19
)

PHPの配列は、何回使っても馴染めない。

PHPが苦手なワテである。

PHPの本を読む

有名な山田さんの本だ。

不器用ですから。

スポンサーリンク
ワテ推薦のプログラミングスクールで学ぶ
コメント募集

この記事に関して何か質問とか補足など有りましたら、このページ下部にあるコメント欄からお知らせ下さい。

PHPVisual Studio
スポンサーリンク
warekoをフォローする
スポンサーリンク
われこ われこ

コメント