PHPプログラミングノート7(組み込み関数3)

組み込み関数についてまとめる

ファイル操作(取得・保存・ベースネーム・ディレクトリパスを返す・絶対パスを返す)

file_get_contents() 

ファイルの内容をすべて取得する。また、URLを指定してウェブサイトのソースを取得することもできる。 

file_put_contents() 

文字列をファイルとして保存する。 

basename() 

ファイルやディレクトリのパスから最後にある名前の部分を返す。 

dirname() 

ファイルパスからディレクトリパスを取り出して返す。

dirname(__FILE__) とすることで実行中のPHPファイルのあるディレクトリを得ることもできる。 
これは「__DIR__」と同義。 

realpath() パスの「/./」や「/../」「/」などの参照を全て解決して正規化した絶対パスを返す。

ファイル操作(ファイルが存在しているか?・F、URLオープン・ファイルロック・1行取得・スプリットして取得)

file_exists() 

指定されたファイルパスにファイルが存在するかを調べて返す。 

fopen() 

ファイルやURLをオープンしてストリームに結びつける。 

flock()

fopen()によってオープンされたファイルのロック・開放を行う。 

fgets() 

ファイルポインタから一行取得する。 

fgetcsv() 

ファイルポインタから一行取得し、指定された文字をもとに区切られた配列を返す。

ファイル関連(fopen() によってオープンされたファイルを書き込み・クローズ・ファイルポインタの位置を先頭に戻す。内容を指定した長さに丸める)

fwrite() 

fopen() によってオープンされたファイルストリームに書き込む。

fclose() 

fopen() によってオープンされたファイルポインタをクローズする。 

rewind() 

ファイルポインタの位置を先頭に戻す。 

ftruncate() 

fopen() によってオープンされたファイルの内容を指定した長さに丸める。 
サイズに 0 を指定することでファイルを空にできる。

ファイル関連(ポインタが終端にいるかどうか?・HTTP POSTでアップロードされたかどうか・←真の時指定されたファイル名に移動する)

feof() 

ファイルポインタが終端に達しているかを調べて返す。 

is_uploaded_file() 

ファイルが HTTP POST によりアップロードされたファイルであるかを調べて返す。 
不正操作を防ぐために用いられる。

move_uploaded_file() 

ファイルが HTTP POST によりアップロードされたファイルである場合、指定されたファイル名に移動する。

ファイル関連(mkdir・ファイル削除・リネームや移動・コピー・ファイルかどうか?・ディレクトリかどうか?・chmod・chown)Linuxと同じコマンドあり

mkdir() 

ディレクトリを作る。パーミッションを設定したり入れ子構造のディレクトリを作ることもできる。 

unlink() 

ファイルを削除する。 

rmdir() 

ディレクトリを削除する。

rename() 

ファイル名を変える。ファイルを移動する。 

copy() 

ファイルをコピーする。 

is_file() 

指定されたパスがファイルを指しているかを調べて返す。 

is_dir() 

指定されたパスがディレクトリを指しているかを調べて返す。 

chmod() 

ファイルのパーミッションを変更する。 

chown() 

ファイルのオーナーを変更する。

ネットワーク(特殊文字をエスケープ・生HTTPヘッダーを出力・改行タグ変換・HTML タグを取り除く・連想配列からURLエンコードされたクエリ文字列を生成)

htmlspecialchars() 

HTMLの特殊文字として扱われる文字をHTMLエンティティに変換する。
(エスケープ)「<」などは「<」に変換され、HTMLタグとして扱われることを防げるほか、 
不正なスクリプトタグを仕込まれて実行されるリスクを回避できる。 
大抵は「ENT_QUOTES」フラグを用いてシングルクォートも変換対象にする。 

header() 

生の HTTP ヘッダーを出力する。 
「HTTP/1.0 404 Not Found」などのステータスコードを出力したり、
「Content-Type: image/jpeg」などのファイルヘッダーを出力することができる。 
「Location: http://www.example.com」とすることで指定された 
URL にリダイレクトする際にも用いられる。
 
nl2br() 

文字列の改行箇所を「<br>」などの改行タグに変換する。 

strip_tags() 

文字列から HTML タグを取り除く。 許可するタグを指定することもできる。 

http_build_query() 

連想配列からURLエンコードされたクエリ文字列を生成する。 
つまり配列を GET パラメータとして使える「foo=123&bar=hello」のような文字列に変換できる。

(URLとして利用できる文字列に変換・GET、POSTなどのパラメータをフィルタリングしたうえで受け取る・指定したフィルターでデータをフィルタリングする。・セッションを開始する。セッションハイジャック攻撃を防ぐ・セッション情報を全て破棄する・クッキーに値を保存する。)

rawurlencode(), rawurldecode() 

rawurlencode() は非アルファベット文字をパーセント記号と16進数を用いて 
URL として利用できる文字列に変換する。 
rawurldecode() によって元の文字列を復元できる。 

filter_input() 

GET、POST などのパラメータをフィルタリングしたうえで受け取る。 
$_GET、$_POST を直接操作するかわりにこの関数を通す。 

filter_var() 

指定したフィルターでデータをフィルタリングする。 
データがメールアドレスとして正しい書式であるかを調べたり、
特殊文字を取り除いたりするなど、様々なフィルタが利用できる。 

session_start() 

セッションを開始する。セッションIDを渡すことで現在のセッションを復帰することもできる。 

session_regenerate_id() 

セッションの情報を位置したままセッションIDを新しく生成した値に置き換える。
 セッションハイジャック攻撃を防ぐ手段として用いられる。 

session_destroy() 

セッション情報を全て破棄する。再開するには再度 session_start() する必要がある。 

setcookie() クッキーに値を保存する。有効期限を設定することもできる。

ハッシュ関連(ハッシュ値を生成する・MD5を使いハッシュ値を生成する・擬似乱数ハッシュ値を生成する・MIMEbase64でエンコード・デコードする・JSON形式で返したり・JSON→連想配列にする・マルチバイト文字に基づいたエンコード変換をしてメール送信)

hash() 

選択したアルゴリズムに基づいてハッシュ値を生成する。

md5() 

MD5 アルゴリズムを用いてハッシュ値を生成する。 

random_bytes() 

暗号論的に安全な疑似乱数生成器(CSPRNG)を使ったハッシュ値を作成。 

base64_encode(), base64_decode() 

文字列を MIME base64 方式でエンコード、デコードする。 

json_encode(), json_decode() 

連想配列を JSON 形式にして返したり、JSON 形式の文字列を連想配列に変換する。 

json_decode() を行う際第二引数に true を指定すると 
stdClass Object のかわりに連想配列に変換される。 

mb_send_mail() 

mb_language() により設定された言語に基づいてエンコード変換を行ってメールを送信する。

その他(ファイル読み込み・1つのみ読み込み・変数の内容表示・変数の詳細表示・
カウント・定数定義・)

require();
require_once();
include();
include_once(); 

別ファイルの読み込み。ファイル読み込めない場合にrequireはエラー、
includeは警告。_onceがついていると同名ファイルは1つのみ読込になる。
読み込む際は __DIR__ を使い絶対パスで指定する。 

print_r() 

変数の内容をわかりやすく表示する。 文字列に限らず連想配列も表示できるほか、
第二引数に true を指定することで結果を文字列として返すこともできる。 

var_dump() 

変数の内容を詳細にダンプする。 含まれるオブジェクトの型、内容を細かく知ることができる。
print_r() よりも詳細な内容を知りたい時に使う。 

count() 

配列やオブジェクトの要素数を数えて返す。 

define() 

定数を定義する。 大文字のアルファベットで名前をつける習慣がある。

その他(変数宣言されているか?Keyが存在するか?・空(0・Null、false)かどうか?・変数破棄・タイムスタンプ関連)

isset() 

変数が宣言されているか、配列にキーが存在するかを返す。 
内容が NULL であっても TRUE を返す。 
配列にキーが存在するかを調べる関数として array_key_exists() があるが、
そちらは ["key" => NULL] の場合 FALSE を返す。 

empty() 

変数の内容が空であるかを返す。空文字、「0」、空配列、NULL、FALSE などがからであると判断される。

unset() 指定した変数を破棄する。連想配列から一部のキーを取り除く際にも使える。 

time(), microtime() 現在のUNIXタイムスタンプを得る。 
1970年1月1日 00:00:00 GMT からの通算秒。 
マイクロ秒まで知りたい場合は microtime() を使う。

mktime()

時、分、秒、月、日、年 を指定することでその日時のUNIXタイムスタンプを得る。

date() 

UNIXタイムスタンプを日時を表す文字列としてフォーマットして出力する。
日時の取り扱いに関しては date() よりも DateTime クラスを利用するケースが増えている。
Carbonライブラリを使う事も多い。

PHPプログラミングノート6(組み込み関数)

文字列・数値の出力

echo() 

ブラウザに1つ以上の文字列を出力

printf(), sprintf()

文字列をフォーマットに当てはめて出力する。

printf() は出力を行い、sprintf() は結果を文字列として返す。

文字列・数値の一致、検索・正規表現による置換・エスケープ

preg_match(), preg_match_all() 

正規表現による一致・検索。
preg_match_all() はパターンにマッチしたすべての値を変数に格納する。 

preg_replace() 

正規表現による置換。パターンにマッチした文字列を指定した文字列に置換する。 

preg_quote() 

正規表現構文の特殊文字の前にバックスラッシュをつけてエスケープする。

正規表現(Regular Expression)の使い方

^ 行頭にマッチする \A

$ 行末にマッチする \z//

. 改行以外の任意の1文字にマッチする

[] 角括弧内の任意の1文字にマッチする

[A-Z] 英大文字A-Zの任意1文字にマッチする

[^] 角括弧内に含まれない1文字にマッチする

* 直前の表現を0回以上繰り返す

+ 直前の表現を1回以上繰り返す

? 直前の表現を0回または1回繰り返す

{n} 直前の表現をn回繰り返す。nは整数。

{n,m} 直前の表現をn回からm回まで繰り返す。n,mは整数。

a|b aまたはbにマッチする

[あ-ん] ひらがなの1文字にマッチする。

文字列の操作関連(置換・取り出し・小文字・大文字変換)

str_replace(), strtr() 

文字列の置換。
strtr() は複数の文字列のペアを渡して同時に置換できる。 

substr(), mb_substr() 

文字列の何文字目から何文字取り出すかを指定して文字列の一部分を返す。 

strtolower(), strtoupper() 

strtolower() はすべてのアルファベットを小文字に変換し、 
strtoupper() はすべてのアルファベットを大文字に変換する。

文字列の操作関連(バイト数・インデックス・文字コード変換・相互変換)

strlen(), mb_strlen()

strlen() は文字列のバイト数を返す。
mb_strlen はマルチバイト文字の文字数を返す。

strpos(), mb_strpos()

文字列の中から指定された文字列が何文字目に存在するかを返す。
大文字小文字を区別しない場合、stripos()、mb_stripos() が用意されている。

mb_convert_encoding()

文字列を指定された文字コードに変換して返す。

mb_convert_kana()

ひらがな・カタカナ、全角・半角を相互に変換する。

文字列・数値の操作関連(切り取り・ランダムに返す・型が(文字列・数値・浮動小数)かどうか・四捨五入・切り捨て・切り上げ

trim(), ltrim(), rtrim()

文字列の前後からスペースやタブなどの空白文字や指定された文字を取り除く。
trim() は前後から取り除き、ltrim() は左から、rtrim() は右からのみ取り除く。

mt_rand()

指定された範囲でランダムな数値を返す。(パスワード生成・トークン生成に使うのはNG。使うならrandom_bytes()。

is_string(), is_int(), is_float(),is_numeric()

与えられた値が文字列か、整数型か、float型(少数)、数値・文字列として扱えるか を返す。

round(), floor(), ceil()

round() は小数部分を四捨五入して返す。
floor() は小数点以下切り捨て、ceil() は小数点以下切り上げで丸める。
桁数を指定することで小数点以下何桁から丸めるかを変更できる。

配列関連(追加・結合・include?・配列かどうか?)

array_push()

配列に配列を追加する。

array_slice()

配列の何番目からいくつ取り出すかを指定して取得する。

array_merge(), array_merge_recursive()

配列同士を結合する。
array_merge_recursive() は再帰的に結合するため多次元配列でも使える。

in_array()

配列の中に指定された値が含まれているかを返す。

is_array()
渡された値が配列であるかを返す。

配列関連(特定カラムの配列作成・Keyと値の結合・マルチソート)

array_column()

多次元配列から特定カラムの配列をつくる。

array_combine()

2つの配列の一方をキー名、もう一方を値として、1つの配列に結合する関数です。

array_multisort()

複数の配列を他の配列の値をもとにソートする。

配列関連(重複削除・reverse・shift・pop)

array_unique()

配列から重複した値を削除して返す。

array_reverse()

配列の要素を逆順にして返す。

array_shift(), array_pop()

array_shift() は配列の先頭から要素を取り出し、

array_pop() は配列の末尾から要素を取り出す。
元の配列は取り出された分短くなる。

配列関連(関数を全要素に適用する・検索・concat・split)

array_walk(), array_walk_recursive()

ユーザー定義関数を配列中のすべての値に適用する。
arra_walk_recursive() は多次元配列に対して再帰的に処理する。

array_search()

配列の中から指定された値を持つ要素を検索し、見つかった場合そのキーを返す。

implode(), explode()

implode() は指定された区切り文字をもとに配列を文字列として結合し、
explode() は指定された区切り文字を元に文字列を配列に変換する。

配列関連(シャッフル・ソート(連想配列・キー・ユーザー定義関数含む)・range)

shuffle()
配列をランダムにシャッフルする。

sort(), rsort()
配列を昇順、降順でソート(並び替え)する。キーは新しく割り振られるため、もともとのキーは削除される。

asort(), arsort()
連想配列を昇順、降順でソート(並び替え)する。もともとのキーは保持される。

ksort(), krsort()
配列のキーをもとに昇順、降順でソートする。

usort(), uasort(), uksort()
ユーザーが定義した関数に基づいて配列をソートする。

range()
指定された範囲の整数・文字を持つ配列を作成する。

配列関連(リセット・配列のポインタを(すすめる・戻す・現在値を返す)・キー部分を変数名とする変数を作る。配列を引数として与えられた複数の変数に分けて代入する。)

reset(), end()
reset() は配列のポインタを先頭の要素のセットし、その値を返す。
reset() は配列のポインタを最後の要素のセットし、その値を返す。
実際には配列の最初や最後の要素を取得する目的で使うことが多い。

next(), prev()
next() は配列のポインタを進め、その値を返す。
prev() は配列のポインタを戻し、その値を返す。

current()
現在の配列のポインタが指す値を返す。

extract()
連想配列のキー部分を変数名とする変数を作る。

list()
配列を引数として与えられた複数の変数に分けて代入する。

 

変数・関数名に使える英語集

変数名や関数名に迷ったときや、意味について知りたかったときに見るもの

使用シーン:追加・作成するとき

set: 主にクラスのプロパティに値を代入する場合に用いる。

add: 追加。配列・リストにデータ、オブジェクトを加えるケースが多い。数値の加算もこちらを用いる。

put: こちらは連想配列(HashMap)などにキーを指定して追加するケースが多い。
あるいはストリームへ文字列を出力する。

insert: 配列・リストなどの任意の位置に挿入する。

append: 末尾に追加する。

prepend: 先頭に追加する。

register: 登録。一覧や名簿への登録。

make: 何かを加工することによって別の役目を持つものを作り出す。

generate: 何かを生成するときに用いる。

create: 新しく作る。データベースへの追加処理まで行うケースも有る。

build: クエリ、構文を組み立てる。

使用シーン:変数・関数名を保存・出力するとき

save: 保存。

store: 貯蔵する、蓄える。ストレージやデータベースへの保存。

export: 書き出し。形式を変換したり任意の形式で保存する。

output: 出力。

write: ファイル、ストリームへの書き込み。

show: 表示する。

render: 画像などを編集した結果を表示したり、項目を HTML などに変換した上で返す。

使用シーン:変数・関数名を検索・解析・取得するとき

get: データの取得。

load: ファイル全体を読み込む場合など。

import: ファイルを対応形式に変換して読み込む。

read: ファイル、ストリームから一行取り出す。

parse: 分解して解析する。XML を要素ごとに分ける場合など、何らかの区切りをもとに分析する。

request: データを要求する。

find: 情報の中から探し出す。見つかることが前提。

search: 情報の中に存在するか探してみる。

extract: 条件による抽出。

filter: フィルター。条件による除外。条件に合わないものを隠す。

seek: 連続したデータの中からあるデータが見つかるまで順番に探す。

fetch: (別の場所から)情報を取ってくる。

query: データベースなどの情報源からデータを引き出すためのルールや条件を指定する。

使用シーン:編集・変更・修正するとき

update: 情報の更新。

edit: データの書き換え。

modify: 部分的に修正する。改造。

change: 全く別の状態に変える。新しいデータで置き換えて古いデータは消滅する。

replace: 順序・文字の入れ替え。

join: データを前方又は後方に付け足す。

merge: 複数のデータを結合する。

normalize: 正規化。値を定められた範囲内に収めるなど、一定のルールに合うように加減する。

increase: 数値・数量を増加させる。

reduce: 数値・数量を減らす。

adjust: 値を調整する。何らかの目的に合うまで値を増減させる。

fix: 破損したデータを修復する。あるいは動かないように固定する。

restore: 元の状態に復元する。保管場所から取り除いたものを再度保管し直す(re + store)。

correct: 誤りのあるデータを正しく直す。

convert: 別の形式に変換する。

enable: 機能を有効にする。使用可能にする。

disable: 機能を無効にする。使用を停止する。

toggle: 状態を逆にする。有効であれば無効化し、無効であれば有効化する。

apply: 適用する。当てはめる。

使用シーン:削除するとき

delete: データの削除。通常は元に戻すことができない。

remove: データをリストや閲覧・アクセス可能な場所から取り除く。

erase: delete がデジタル色が強いのに対して、こちらは消しゴムでこすって消す場合などのアナログな用途にも使える。

clear: 中身を空にする。

destroy: 完全かつ確実なオブジェクトの破棄。後始末をしてもう二度と使えない状態にする。

unregister: 登録を解除する。

unset: セット済みのプロパティ、定義済みの変数をセット前、未定義の状態に戻す。

使用シーン:検証・検査 するとき

is~: オブジェクトが特定の型、状態であるか調べて true/false を返す。isEmpty, isValid のように状態を表す語と組み合わせて使う。

has~: オブジェクトが特定のプロパティを持っているかを調べて true/false を返す。権限、属性の所有を確認する。

contains: 配列に特定の値が含まれているかを調べて true/false を返す。

~exists: 項目の有無を調べる。

check: 広い意味での確認。validate が対象の正しさを検証するのに対し、check は対象が真か偽を調べたり、単に変数に何が入っているかを知るために使われる。

validate: 正しいものであるか確かめる。

verify: 正しく動作しているか確かめる。

使用シーン:許可・禁止するとき

allow: 許可する。
disallow: 許可しない。

accept: 申請・要求を承認する。受け入れる。

deny: 否定・否認する。

refuse: 申請・要求をはっきりと断る。

reject: 申請・要求を退ける。

ban: 危険なもの・悪質なものに対する禁止。

grant: 信用して許可を与える。正しいと認める。

その他

try: 例外の発生する可能性のある処理を試みる。

attempt: 処理を試みる。言葉の意味としては try に近いが、やや硬く、より難易度の高いものに使われることが多い。

exec: 処理、命令、短期的なスクリプト、アプリケーションの実行。=execute。

run: 継続性のある処理やスクリプト、アプリケーションの開始。

process: 手順に従って処理・加工する。

bind: 結びつける。仮の要素を実際の内容で置き換える。

init: 初期化する。デフォルトとなる値をセットする。=initialize。

reset: 既に初期化されたものに初期値をセットし直す。

open: 通信やストリームへの接続。

close: 通信やストリームの終了・切断。

start: 始動。対義語は stop。止まっていたものが動き始める。

stop: 停止。start あるいは run と対にして使う。動いているものを止める。

abort: 中断・遮断。動作しているものを中止する。途中から再開されることはない。異常、障害による強制終了。

pause: 一時停止。

suspend: 保留・延期。

begin: 始める。

end: 終了。

terminate: 終わりにする。

complete: 必要な要素、要件を満たす。補完。

参考記事

https://php-archive.net/php/words-in-function-names/
https://oxynotes.com/?p=8679
https://nelog.jp/programming-words

PHPプログラミングノート5(組み込み関数,ユーザー関数)

関数の作成法(JavaScriptとほぼ同じ感じ)

<?php

// 関数

// 引数なし 戻り値なし

function Hello_World(){

  echo'Hello World!';

}

Hello_World();

  echo '<br>';

// 引数あり 戻り値なし

function getString($string){

  echo$string;

}

getString('Hello_World!');

// 引数なし 戻り値なし
function getNumber(){
  return 5;
}

echo '<br>';

echo getNumber();

echo '<br>';

var_dump (getNumber());

$num = getNumber();

echo '<br>';

echo $num;

// 引数2つ 戻り値あり

function sumNumbers($num1, $num2){

  $num3 = $num1 + $num2;

  return $num3;
}
  echo '<br>';

  $total = sumNumbers(4,7);

  echo $total;

?>

↑を出力すると・・・

Hello World!
Hello_World!
5
int(5)
5
11

組み込み関数

<?php

// 組み込み関数 文字列の長さ

$strings = 'aiueo';

$strings1 = 'あいうえお';

echo strlen($strings);

echo '<br>';

// マルチバイト文字 日本語はSJIS, UTF-8 3~6バイトの場合

echo mb_strlen($strings1);

echo '<br>';

// 文字列の置換

$str = 'aiueo';

echo str_replace('aiueo','あいうえお',$str);

$split = 'Hello_World!';

//文字列の分割Rubyのsplitみたいなもの

echo '<pre>';

var_dump(explode('_', $split));

echo '</pre>';

// 正規表現で特定の文字が含まれるか確認する;

$str1 = 'Hello_World!';

echo preg_match('/Hello/',$str1);

echo '<br>';

// 指定文字列から文字列を取得する マルチバイト文字はmb_が必要

echo substr('Hello_World!', 5);

?>

↑を出力すると・・・

5
5
あいうえお

array(2) {
  [0]=>
  string(5) "Hello"
  [1]=>
  string(6) "World!"
}


1
_World!

ユーザー関数の作り方

Rubyと同じようにキャメルケースかスネークケースで名付ける

<?php

// ユーザー関数 郵便番号の書式になっているか調べる関数
//camelCase(ラクダ(camel)のコブのような書式)
$zipCode = '123-45678';
$zipCode1 = '123-4567';

function checkzipCode($str){

//変数内の-(ハイフン)を空白に置き換える
  $replaced = str_replace('-','',$str);

//文字列の長さを$lengthに代入する
  $length = strlen($replaced);

//文字列の長さを出力
  var_dump($length);

//文字列の長さが7のときにtrueを返すがそれ以外はfalseを返す
  if($length === 7){

    returntrue;

  }
    returnfalse;
  }

var_dump(checkzipCode($zipCode));

echo '<br>';

var_dump(checkzipCode($zipCode1));

?>

↑を出力すると・・・

int(8) bool(false)
int(7) bool(true)

8文字なのでfalseが帰り、7文字のときはTrueが帰ってくる

PHPプログラミングノート4(foreach~switch)

foreach

<?php

// foreach

$ary_persons = [

'name' => 'suzutuki',

'weight' => '55kg',

'height' => '179cm'

];

// Valueのみ表示

foreach($ary_persons as $ary_person){

  echo$ary_person;

}

// KeyとValue両方表示

  echo '<br>';

foreach($ary_persons as $key => $value){

  echo$key.'は'.$value.'です';

}

?>

↑を出力すると・・・

suzutuki55kg179cm
nameはsuzutukiですweightは55kgですheightは179cmです

入れ子が深い場合はこのように出力する

<?php

// foreach

// 連想配列

$ary_members_3 = [ 
'sun_group' => [ 
'suzutuki' => [ 
'weight' => '55kg',
 'height' => '179cm' 
], 
'akatuki' => [ 
'weight' => '70kg', 
'height' => '183cm'
 ],
 ], 
'moon_group' => [
 'akina' => [
 'weight' => '45kg',
 'height' => '149cm'
 ], 
'kotaro' => [
 'weight' => '60kg',
 'height' => '175m'
 ]
 ]
];

// Value両方表示

echo '<br>';

foreach($ary_members_3 as $ary_members_2){

foreach($ary_members_2 as $ary_members_1){

foreach($ary_members_1 as $ary_members => $value){

echo$ary_members.'は'.$value.'です';

// echo $key . 'は' . $value . 'です';

}

}

}

?>

↑を出力すると・・・

weightは55kgですheightは179cmですweightは70kgですheightは183cmですweightは45kgですheightは149cmですweightは60kgですheightは175mです

KeyとValue両方表示する場合は

<?php
// foreach

// 連想配列

$ary_members_3 = [ 
'sun_group' => [ 
'suzutuki' => [ 
'weight' => '55kg',
'height' => '179cm' 
], 
'akatuki' => [ 
'weight' => '70kg', 
'height' => '183cm'
],
], 
'moon_group' => [
'akina' => [
'weight' => '45kg',
'height' => '149cm'
], 
'kotaro' => [
'weight' => '60kg',
'height' => '175m'
]
]
];
// KeyとValue両方表示

echo '<br>';

foreach($ary_members_3 as $ary_members_2){

 foreach($ary_members_2 as $ary_members_1){
 
  foreach($ary_members_1 as $key => $value){

   echo $key . 'は' . $value . 'です';
}
}
}
?>

↑を出力すると・・・

weightは55kgですheightは179cmですweightは70kgですheightは183cmですweightは45kgですheightは149cmですweightは60kgですheightは175mです

for、while、do while文

<?php

// for、while文
for($i = 0; $i < 10; $i++ ) {

if($i === 4){
}
echo $i;
}

echo '<br>';

$j = 0;
while($j < 7){
echo $j;
$j++;
}
echo '<br>';

$h = 0;
do{
echo $h;
$h++;
}
while($h < 5);

?>

↑を出力すると・・・

0123456789
0123456
01234

switch文(Rubyのcase文に似ているが違う)

// switch文
$num = 1;
switch ($num) {

  case1:

    echo'1です';

    break;

  case2:

    echo'2です';

    break;
 
  case3:

    echo'3です';

    break;

  default:

    echo'1-3です';
}

↑を出力すると・・・

1です

PHPプログラミングノート3(演算子とif)

算術演算子の使い方

Rubyとほぼ同じだが、割り算をするときに小数点がつくのが違う部分だ

<?php

// 演算子

$num_1 = 9;

$num_2 = 6;

$result_1 = $num_1 + $num_2;

$result_2 = $num_2 - $num_1;

$result_3 = $num_1 * $num_2;

$result_4 = $num_2 / $num_1;

$result_5 = $num_1 % $num_2;

// 見やすくする

echo '<pre>';

echo $result_1;

echo '<pre>';

echo $result_2;

echo '<pre>';

echo $result_3;

echo '<pre>';

echo $result_4;

echo '<pre>';

echo $result_5;

echo '<pre>';

?>

↑を出力すると・・・

15
-3
54
0.66666666666667
3

if文の一番簡単な構文(Rubyとほぼ同じ)

<?php

// ifの構文

// if (条件) {

// 条件が真なら実行

// }

$point = 70;

if ($point >= 70) {

echo'テストの合格点は'.$point.'以上なので合格です';

  }

?>

↑を出力すると・・・

テストの合格点は70以上なので合格です

※また==と===があり、Rubyと同じで===は型も一致しているかどうか判定する

<?php

// ifの構文

// if (条件) {

// 条件が真なら実行

// }else{

// }

$point = 60;

if ($point >= 70) {

echo'テストの合格点は'.$point.'以上なので合格です';

}else{

echo'不合格です';

}

?>

↑を出力すると・・・

不合格です

2重if文や、else if、 elseなど

<?php

// ifの構文

// if (条件) {

// 条件が真なら実行

// }else{

// }

$point = 72;

$report = true;

if ($point >= 90) {

if ($report){

echo'評価はSです';

}

}else if($point >= 70){

echo'評価はAです';

}

else{

echo'不合格です';

}

?>

わざわざ2重if文を使うよりもRubyのように and && or || を使うと良い

!= はRubyと同じでNotEqualだが、!==は型も一致しているかどうかで調べられるのがRubyと違うところ

空かどうか?(is_null,empty)Rubyとほぼ同じ

$ary = [];

$report = true;

if (empty($ary) ) {

echo'空です';

}else{

echo'なにか入っています';

}

?>

3項演算子Rubyとほぼ同じ(ただし直接出力ができない)

<?php

// ifの構文

// 3項演算子の構文
// 条件 ? 真 : 偽

$ary = [];

$result = empty($ary) ? '空です' : 'なにか入っています';

echo $result;

?>

↑を出力すると・・・

空です

PHPプログラミングノート2(連想配列)

連想配列はよく使うので理解を深める

連想配列 (Rubyのハッシュににている)

<?php

// 連想配列

$ary_person = [

'name' => 'suzutuki',

'weight' => '55kg',

'height' => '179cm'

];

echo $ary_person['height'];

echo('<br>');

var_dump($ary_person);

?>

実行すると・・・

179cm
array(3) { ["name"]=> string(8) "suzutuki" ["weight"]=> string(4) "55kg" ["height"]=> string(5) "179cm" }

更に入れ子構造になっている連想配列

<?php

// 連想配列

$ary_member = [

  'sun_group' => [

  'suzutuki' => [

  'weight' => '55kg',
 
  'height' => '179cm'

],
  
  'akatuki' => [

  'weight' => '70kg',

  'height' => '183cm'

],

],

  'moon_group' => [

  'akina' => [

  'weight' => '45kg',

  'height' => '149cm'

],

  'kotaro' => [

  'weight' => '60kg',

  'height' => '175m'

]

]

];
// moon_groupのakinaのweightを出力
echo$ary_member['moon_group']['akina']['weight'];

// 見やすくする

echo'<pre>';

//ary_memberのすべてを出力する
var_dump($ary_member);

echo'<pre>';

?>

↑を出力すると・・・

45kg
array(2) {
  ["sun_group"]=>
  array(2) {
    ["suzutuki"]=>
    array(2) {
      ["weight"]=>
      string(4) "55kg"
      ["height"]=>
      string(5) "179cm"
    }
    ["akatuki"]=>
    array(2) {
      ["weight"]=>
      string(4) "70kg"
      ["height"]=>
      string(5) "183cm"
    }
  }
  ["moon_group"]=>
  array(2) {
    ["akina"]=>
    array(2) {
      ["weight"]=>
      string(4) "45kg"
      ["height"]=>
      string(5) "149cm"
    }
    ["kotaro"]=>
    array(2) {
      ["weight"]=>
      string(4) "60kg"
      ["height"]=>
      string(4) "175m"
    }
  }
}

PHPのまとめ1環境構築から2次元配列まで(プログラミングノート)

PHP学習のための準備

MAMPをインストールする

MAMPで検索してインストールする

MAMP→htdocs→php_testのファイルを作成して→PHPファイルを設置してブラウザで確認する

ブラウザで確認する方法

http://127.0.0.1/php_test/ファイル名

PHPの基本構文<?php?>

<?php
  echo('test');
  phpinfo();
?>

<?php から始まり ?> で終わる。実行するときは;(セミコロン)を利用する

HTMLとPHPを使うとき

<!DOCTYPE html>
<head></head>
<body>

こちらはHTMLだよ

<?php
  echo('こちらはPHPだよ');
?>
</body>
</html>

コメント数字や文字列の使い方

<?php
// 1行コメントのときは//

/*複数行コメントの場合は/**/の間に書く
*/

//半角のときは数値として認識される

 echo(789);
echo('<br>');
//全角の場合文字列として認識される

echo(789);
echo('<br>');
//文字列の場合はRubyと同じで''""を使う

echo('文字列');
echo('<br>');
echo("文字列");
echo('<br>');
?>

変数と.について

<?php

// 変数 Rubyと同じ動的型付け言語 先頭は英文字 × 1int ○_numはできる

$num = 123;

$num2 = 234;

$sum = $num . $num2;

$strings = '文字列だよ';

// 配列 オブジェクト コレクション型

var_dump($sum);

?>

実行結果

string(6) "123234"

数字同士を足したはずなのに文字列同士を足して出力された。

暗黙的に変換された?(Rubyとは違う)

定数 (constで定義) JavaScriptに似ている

<?php

// 定数 変わらないものに使う 文字

// constantの略

const TAX = '10%';

echo TAX;

?>

配列 Rubyとほぼ同じ感じで[]内に入れる

<?php

// 配列

$ary = [1,2,3];
$ary2 = ['aiueo',5,7];
echo $ary[1];
// 見やすくする
echo '<pre>';

var_dump($ary);
var_dump($ary2);
echo '</pre>';

?>

出力すると・・・

2
array(3) {
[0]=>
int(1)
[1]=>
int(2)
[2]=>
int(3)
}
array(3) {
[0]=>
string(5) "aiueo"
[1]=>
int(5)
[2]=>
int(7)
}

2次元配列の作り方 (Rubyとほぼ同じ)

<?php

// 2次元配列

$ary3 = [

[4,5,6],

[8,9,10]

];

var_dump($ary3);

?>

↑を出力すると・・・

array(2) { [0]=> array(3) { [0]=> int(4) [1]=> int(5) [2]=> int(6) } [1]=> array(3) { [0]=> int(8) [1]=> int(9) [2]=> int(10) } }

PaizaAランクLvアップ問題と解説(Ruby)その10(累積和の計算)

※スキルチェック問題ではありません。
規約により公式の解答コードそのままはよろしくないので、
オリジナルのコードにしています。

詳しくはコチラ

なるべくわかりやすい解説を付けました。

1:累積和の計算 (paizaランク C 相当)

数列 A についての情報が与えられるので、 1 ~ N の各 i について、和 S_i = A_1 + … + A_i を求めてください。

入力される値

N       
A_1 A_2 ... A_N
・ 1 行目には、数列 A の要素数 N が与えられます。
・ 2 行目には、数列 A の各要素 A_1, A_2 … A_N が与えられます。入力値最終行の末尾に改行が1つ入ります。
文字列は標準入力から渡されます。
期待する出力
N 行の出力

・S_i(1 ≦ i ≦ N) を出力してください。

S_1     
...     
S_N
条件

すべてのテストケースにおいて、以下の条件をみたします。
・ 1 ≦ N ≦ 10 ^ 5
・ -100 ≦ A_i ≦ 100
入力例1

10
0 1 2 3 4 5 6 7 8 9
出力例1

0
1
3
6
10
15
21
28
36
45
入力例2

1
100
出力例2

100

解答と解説

1:総当り法(良くない方法パフォーマンスが良くない)

計算量がO(N²)となってしまい。めちゃくちゃ時間がかかってしまいます。

#1行目の入力値(数値)を変数に代入する
n = gets.to_i

#2行目の半角スペース刻みの入力値(数値)を変数に多重代入する
m = gets.split.map(&:to_i)

#n回繰り返す
n.times do |i|
 
#mの配列の0(初めから)からmまでの範囲を足したものを出力する
  puts m[0..i].sum 

end

計算量がO(N²)となってしまい。↑のようにテスト4でめちゃくちゃ時間がかかってしまいます。

2:別解    いい方法(パフォーマンスが良い)

1:変数xを予め用意して(変数名はわかりやすいものなら何でもOKです)0で初期化します
2:変数xに現在の値m[i]を加算して出力します。

#1行目の入力値(数値)を変数に代入する
n = gets.to_i
#2行目の半角スペース刻みの入力値(数値)を変数に多重代入する
m = gets.split.map(&:to_i)
x = 0

#n回繰り返す
n.times do |i|
#xに加算して現在の値m[i]を加算して出力する。
 puts x += m[i]
end

計算量がO(N)になったことでテスト4が劇的に速くなりました!

↑のコードを短くすると

n = gets.to_i
m = gets.split.map(&:to_i)
x = 0
n.times { |i| puts x += m[i] }

なぜ解答1は実行時間が遅いのか?(入力例1で解説)

解答1の場合このような毎回0から加算していく計算をするので計算数が増えてしまいます。

0                                                                                計算回数0回  0を出力

0+1=1                                計算回数1回  1を出力

0+1+2=3                           計算回数2回  3を出力

0+1+2+3=6                計算回数3回  6を出力

0+1+2+3+4=10             計算回数4回  10を出力

0+1+2+3+4+5=15           計算回数5回  15を出力

0+1+2+3+4+5+6=21         計算回数6回  21を出力

0+1+2+3+4+5+6+7=28       計算回数7回  28を出力

0+1+2+3+4+5+6+7+8=36     計算回数8回  36を出力

0+1+2+3+4+5+6+7+8+9=45   計算回数9回  45を出力

nが10付近になると膨大な計算数になってしまいます

なぜ解答2で実行時間が速くなるのか?

結論:変数xに加算していき、加算したあとの変数xを出力することで計算数を減らせたので速くなりました。

私達人間が一般的に頭の中で計算して累積和を出す計算方法を使う。

0       計算回数0回
0+1=1   計算回数1回
1+2=3   計算回数1回
3+3=6   計算回数1回
6+4=10  計算回数1回
10+5=15 計算回数1回
15+6=21 計算回数1回
21+7=28 計算回数1回
28+8=36 計算回数1回
36+9=45 計算回数1回

というように

これまでに足した数(例:45)と今計算したい数字(例:10)を加算して答えを出します。

解答2はこれまでに足した数x今計算したい数字m[i]を足して、加算したあとに出力しているので計算数を減らすことができたので実行時間を早くすることができました!

再帰関数で階乗を求める (Ruby)

目標

アルゴリズムを利用した方法で再帰関数がよく使われるので練習して使えるようにする

そもそも再帰関数とは?

アルゴリズムなどを記述するときに、自分自身を引用する形で定義することを再帰的定義といい
自分自身を呼び出す関数のことを再帰関数といいます。

再帰関数の基本的なルールは2つです。

1:自分自身の関数を用いて、問題を少し簡単にするための計算式をたてる
2:簡単なパターンの場合の答えを用意する

階乗を求める関数factorialを用いて問題を解いてみましょう。

階乗(factorial)を求めるメソッド

def factorial(n) 
  if n <= 0  
 #0! = 1なので1を返す
     return 1
  else
   # 動作確認用
   p n
   #ここでfactorial自身を呼び出す
   return n * factorial(n-1) 
  end
end
p factorial(5) #120

5! = 120なので問題ないですね。

p nで動きを確認すると・・・

5
4
3
2
1

↑のようにnの値が変化していることを確認できます。

p n * fact(n-1) で動きを確認すると・・・

1
2
6
24
120

↑のように出力されることが確認されます。
これは再帰関数を使わない、each,times,whileなどのようなループとは挙動が違い、
初めて使う場合はなぜこのようになるのか混乱してしまいます。

そこでpコマンドなどで処理の流れを見ることでどうなっているのか確認します。

p “#{n} * #{fact(n-1)}” で処理を確認してみると・・・

"1 * 1"
"2 * 1 * 1"
"3 * 2 * 1 * 1"
"4 * 3 * 2 * 1 * 1"
"5 * 4 * 3 * 2 * 1 * 1"
"5 * 4 * 3 * 2 * 1 * 1"

↑のように計算していることがわかりますね。

実際はこのように動いているようです。

1:factorial(5)はfactorial(4) × 5 を返すことになっているので、関数factorial(4)を呼び出します。
2:factorial(4)はfactorial(3) × 4 を返すことになっているので、関数factorial(3)を呼び出します。
3:factorial(3)はfactorial(2) × 3 を返すことになっているので、関数factorial(2)を呼び出します。
4:factorial(2)はfactorial(1) × 2 を返すことになっているので、関数factorial(1)を呼び出します。
5: factorial(1)はfactorial(0) × 1 を返すことになっているので、関数factorial(0)を呼び出します。
6:factorial(0)はN<=0の条件をみたすので1を返します。
7:factorial(1)はfactorial(0)の呼び出しが終わったので1 × 1 = 1を返します。
6:factorial(2)はfactorial(1)の呼び出しが終わったので2 × 1 × 1 = 2を返します。
7:factorial(3)はfactorial(1)の呼び出しが終わったので3 × 2 × 1 × 1= 6を返します。
8:factorial(4)はfactorial(1)の呼び出しが終わったので4 × 3 × 2 × 1 × 1 = 24を返します。
9:factorial(5)はfactorial(1)の呼び出しが終わったので5 × 4 × 3 × 2 × 1 × 1 = 120を返します

これにより5~9の部分が出力されたので1,2,6,24,120というように出力されました。