ざっくりん雑記

プログラミングで忘れそうなことをひたすらメモる

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"]

参考

たのしいRuby 第5版

たのしいRuby 第5版

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

参考

たのしいRuby 第5版

たのしいRuby 第5版

qiita.com

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であればページの適当なところを右クリックし ページのソースを表示で表示できる。

参考

プログラミングPHP 第3版

プログラミングPHP 第3版

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 以降では、ヒアドキュメントの宣言をダブルクォートで囲めるようになった。

ダブルクォーテーション、シングルクォーテーション、空白などが素直に出力される。

寿司くん

参考

プログラミングPHP 第3版

プログラミングPHP 第3版

PHP: 文字列 - Manual

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となる。

タイプヒンティング

渡ってきたパラメータが特定のクラス(あるいは特定のクラスを継承したクラス)のインスタンスであるか?コールバック関数であるか?…というバリデーション的なことが可能。

この部分の説明に関しては、とても分かりやすく解説された記事があるため、こちらを紹介します。

dekokun.github.io

参考

プログラミングPHP 第3版

プログラミングPHP 第3版

PHP: ユーザー定義関数 - Manual

PHP: 関数の引数 - Manual

PHPでコールバック関数を利用する - Qiita

PHP - キャスト演算子

値を特定の型として扱いたい

PHPは元々、弱い型付けの言語であるが、特定の型として扱いたい場面もある。 そういった時は以下のキャスト演算子でキャストすることも可能。

PHPのキャスト演算子

演算子 同じ意味の演算子 変更後の型
(int) (integer) 整数
(bool) (boolean) 論理値
(float) (double), (real) 浮動小数点数
(string) 文字列
(array) 配列
(object) オブジェクト
(unset) NULL

(string) に関してはstrval()関数と同様。

参考

プログラミングPHP 第3版

プログラミングPHP 第3版

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なので、その辺と混同して間違いやすいですね。 気をつけよう。

参考