Ruby - 配列の作り方いろいろ
Rubyでの配列の作り方
Array.new
array = Array.new p array array = Array.new(3) p array array = Array.new(5, 'Ruby') p array
- 何も指定しない
- そのまま0個の配列ができる
- 引数を1つだけ(数値)
- その引数の数だけ
nil
の要素が入った配列ができる
- その引数の数だけ
- 引数を2つ
- 1つの目の引数:要素数を指定
- 2つの目の引数:格納したい値 で配列ができる
[] [nil, nil, nil] ["Ruby", "Ruby", "Ruby", "Ruby", "Ruby"]
%w
, %i
要素に空白が含まれていない、つまりそれぞれの区切りが明確になっている場合のみ、使える %w
, %i
neta = %w(まぐろ サーモン えび かに うに) p neta neta2 = %i(まぐろ サーモン えび かに うに) p neta2
["まぐろ", "サーモン", "えび", "かに", "うに"] [:まぐろ, :サーモン, :えび, :かに, :うに]
%w
は文字列の配列をつくりたいときに、%i
は文字列がシンボルの配列となる。
to_a
配列の作り方としては、あまりメジャーでないがこれでもできなくはない、的なもの。 to_aは多くのクラスで定義されているメソッドでそれぞれのオブジェクトを配列に変換してくれる。
sushi_hash = { :maguro => ['まぐろ', 100], :salmon => ['サーモン', 120], :egg => ['たまご', 150] } sushi_array = sushi_hash.to_a p sushi_array
[[:maguro, ["まぐろ", 100]], [:salmon, ["サーモン", 120]], [:egg, ["たまご", 150]]]
例ではハッシュを配列に変換している。
文字列split
あらゆる情報がカンマで句切られた一つの文字列をsplitメソッドで分割した結果が配列になるパターン。 わりと使われる手法。
person = "寿司太郎,男,まぐろが好き,2016-4-12" profile = person.split(',') p profile
["寿司太郎", "男", "まぐろが好き", "2016-4-12"]
参考
- 作者: 高橋征義,後藤裕蔵,まつもとゆきひろ
- 出版社/メーカー: SBクリエイティブ
- 発売日: 2016/02/26
- メディア: 単行本
- この商品を含むブログ (1件) を見る
Ruby - 配列やハッシュの繰り返し each
配列の要素をいい感じに取り出して利用する
eachメソッドは「イテレータ」という種類のメソッドで、以下のような構文
配列.each do |変数| 繰り返したい処理 end
または
配列.each{|変数|} 繰り返したい処理 end
最初の例では、each以降のdo ~ end
の部分はブロックと呼ばれる部分で、こういった構文のため一般にブロック付きメソッドとも呼ばれる。ふたつ目の例はdoを省略したかたちで、基本的にこちらほうが見やすそう。
|変数|
という部分では、配列から1つずつ取りだす際に使う変数名を指定することができる。その変数をブロック内で利用することになる。なのでわかりやすい命名をしたい。
基本的な使い方の例
基本は配列もハッシュも同じような構文で、ハッシュの場合は変数を2つ設定できる。以下にハッシュの場合を示す。
neta = { :maguro => 'まぐろ', :salmon => 'サーモン', :tamago => 'たまご' } neta.each do |key, value| puts "#{key}:#{value}" end
$ruby array_prac.rb maguro:まぐろ salmon:サーモン tamago:たまご
いろんな使い方
ブロック的に使わないでかんたんに書きたいとき
neta.each{|en, ja| puts "#{en}を日本語で, #{ja}と言う!"}
$ruby array_prac.rb tunaを日本語で, まぐろと言う! salmonを日本語で, サーモンと言う! eggを日本語で, たまごと言う!
ハッシュの深さがある場合
変数指定に括弧を使えば、いい感じにやってくれる。
neta = { :tuna => ['まぐろ', 100], :salmon => ['サーモン', 200], :egg => ['たまご', 300] } neta.each{|id, (name, price)| puts "#{id}: #{name}, #{price}"}
$ruby array_prac.rb tuna: まぐろ, 100 salmon: サーモン, 200 egg: たまご, 300
参考
- 作者: 高橋征義,後藤裕蔵,まつもとゆきひろ
- 出版社/メーカー: SBクリエイティブ
- 発売日: 2016/02/26
- メディア: 単行本
- この商品を含むブログ (1件) を見る
PHP - print_r()とvar_dump()について
print_r()
やvar_dump()
は、渡された内容を見やすい形式で出力する。文字列や数値の場合はecho
, print()
と同様に単純に文字列として出力する。
配列の場合は、以下のように出力する。
<?php $a = array('name' => 'azunobu', 'age' => 20, 'location' => 'Iwate'); print_r($a); var_dump($a);
出力
Array ( [name] => azunobu [age] => 20 [location] => Iwate ) array(3) { ["name"]=> string(7) "azunobu" ["age"]=> int(20) ["location"]=> string(5) "Iwate" }
オブジェクトの場合は、以下のように出力する。
<?php class Sample { var $name = 'azunobu'; } $o = new Sample; print_r($o); var_dump($o);
出力
Sample Object ( [name] => azunobu ) object(Sample)#1 (1) { ["name"]=> string(7) "azunobu" }
print_r()とvar_dump()の違い
まず、print_r()
は論理値やNULLだとうまく表示してくれない。
print_r(true); // "1"を出力 print_r(false); // ""を出力 print_r(null); // ""を出力
一方、var_dump()
は、論理値やNULLであっても表示してくれる。
var_dump(true); // "bool(true)"と出力 var_dump(false); // "bool(false)"と出力 var_dump(null); // "bool(null)"と出力
以上のことから、デバッグ時に使うとすれば、人間的に読みやすい形式で出力してくれるvar_dump()
のが使い勝手が良さそう。
なお、出力された値をブラウザで確認する際は、ソースを見たほうが改行がうまく効いて見やすい。Chromeであればページの適当なところを右クリックし ページのソースを表示
で表示できる。
参考
- 作者: Kevin Tatroe,Peter MacIntyre,Rasmus Lerdorf,高木正弘
- 出版社/メーカー: オライリージャパン
- 発売日: 2014/03/25
- メディア: 大型本
- この商品を含むブログ (8件) を見る
PHP - ヒアドキュメント
複数行にまたがる文字列を出力したいとすると、文字列を連結したり、以下のように
<?php echo '照りつける 太陽 照り焼けちまいそう\n'; echo 'ハードボイルドだろ? パネェだろ?\n'; echo 'キモい カワイイ 賛否両論 NO MORE WAR\n'; ...
echoしまくる感じになるが、ちょっと面倒くさい。
ヒアドキュメントを使う
ヒアドキュメントを用いれば、複数行にまたがる文字列を手軽に書ける。
$str = <<< "EndOfQuote" 照りつける 太陽 照り焼けちまいそう ハードボイルドだろ? パネェだろ? キモい カワイイ 賛否両論 NO MORE WAR サブカル 女子 凝視 酢飯飛び散る Let's go to the animation 寿司くん! EndOfQuote; var_dump($str);
出力
string(260) "照りつける 太陽 照り焼けちまいそう ハードボイルドだろ? パネェだろ? キモい カワイイ 賛否両論 NO MORE WAR サブカル 女子 凝視 酢飯飛び散る Let's go to the animation 寿司くん! "
改行も含まれている。
<?php printf(<<< "Template" %s is %s. Template , "寿司くん", "Sushi");
出力
寿司くん is Sushi.
書き方
<<< [識別子]
というトークンが、ヒアドキュメントの開始を示す。
<<<
と[識別子]
の間には半角スペースが1つ必要。文字列を書き終えたら、改行し識別子を示すことで、文字列の終端を示す。
また、PHP 5.3.0 以降では、ヒアドキュメントの宣言をダブルクォートで囲めるようになった。
ダブルクォーテーション、シングルクォーテーション、空白などが素直に出力される。
寿司くん
参考
- 作者: Kevin Tatroe,Peter MacIntyre,Rasmus Lerdorf,高木正弘
- 出版社/メーカー: オライリージャパン
- 発売日: 2014/03/25
- メディア: 大型本
- この商品を含むブログ (8件) を見る
PHP - 関数のパラメータ
関数を定義するとき、任意の値を引数(パラメータ)として渡すことができる。
渡す方法として、値渡し
と参照渡し
がある。
値渡しのパラメータ
大抵の場合は、こちらを使う。引数には任意の式を指定でき、式の内容が評価された後の値が関数に渡される。
<?php function greeting($name) { echo $name."さん。おはよう。"; } $name = "azunobu"; greeting($name);
例として、こういったかたちで書ける。
参照渡しのパラメータ
参照渡しでは、通常のスコープの規則を無視し、関数内から直接変数の値を操作する。そのため、参照渡しではパラメータとして変数を渡す必要がある。 参照で渡す、ということを明示するには関数のパラメータリストの引数名の前にアンパサンド記号(&)を付ける。
<?php function greeting(&$personName) { echo $personName."さん。おはよう。"; } $name = "azunobu"; greeting($name);
この例では、関数内の$personName
は参照渡しで渡されているので、直接$name
を参照している。
そのため、値の変更も関数内で直接変更を加えることができる。
また、参照渡しの主な恩恵としては、変数をコピーする必要がない。PHPでは、値渡しを行うと関数を実行する前に値の内容のコピーを作成する必要がある。 長い文字列や大きなオブジェクトの場合、このコピーは大きなコストになり実行速度にも影響を与えかねない。 参照渡しはこの点、コピーをせず直接参照できるため有利。
可変パラメータ
関数のパラメータの数を可変にしたい、という時もある。
PHP5.6以降であれば、パラメータリストに ... トークン
を含めることで、 その関数が可変長の引数を受け取ることを示すことができる。
<?php function sum(...$numbers) { $total = 0; foreach ($numbers as $num) { $total += $num; } return $total; } echo sum(1, 2, 3, 4, 5, 6, 7, 8, 9);
出力結果は45
となる。
タイプヒンティング
渡ってきたパラメータが特定のクラス(あるいは特定のクラスを継承したクラス)のインスタンスであるか?コールバック関数であるか?…というバリデーション的なことが可能。
この部分の説明に関しては、とても分かりやすく解説された記事があるため、こちらを紹介します。
参考
- 作者: Kevin Tatroe,Peter MacIntyre,Rasmus Lerdorf,高木正弘
- 出版社/メーカー: オライリージャパン
- 発売日: 2014/03/25
- メディア: 大型本
- この商品を含むブログ (8件) を見る
PHP - キャスト演算子
値を特定の型として扱いたい
PHPは元々、弱い型付けの言語であるが、特定の型として扱いたい場面もある。 そういった時は以下のキャスト演算子でキャストすることも可能。
演算子 | 同じ意味の演算子 | 変更後の型 |
---|---|---|
(int) | (integer) | 整数 |
(bool) | (boolean) | 論理値 |
(float) | (double), (real) | 浮動小数点数 |
(string) | 文字列 | |
(array) | 配列 | |
(object) | オブジェクト | |
(unset) | NULL |
(string) に関してはstrval()関数と同様。
参考
- 作者: Kevin Tatroe,Peter MacIntyre,Rasmus Lerdorf,高木正弘
- 出版社/メーカー: オライリージャパン
- 発売日: 2014/03/25
- メディア: 大型本
- この商品を含むブログ (8件) を見る
PHP (PDO) - Unknown character set
PDOクラスにおいてのDB接続時エラー
define('DSN', 'mysql:host=localhost;dbname=hoge;charset=utf-8;'); define('USER', 'piyouser'); define('PASSWORD', '1234'); try { $dbh = new PDO(DSN, USER, PASSWORD); echo '接続に成功しました。'.'<br>'; } catch (PDOException $e) { echo $e->getMessage(); exit; }
エラー:SQLSTATE[HY000] [2019] Unknown character set
MySQLに対してのcharsetはutf-8
ではなくutf8
です。
HTMLを書いているとcharset=utf-8
なので、その辺と混同して間違いやすいですね。
気をつけよう。