RubyとPHPの比較(条件分岐、配列、ハッシュ)

# この記事の概要
Rubyで学習を始めてPHPに言語チェンジをする人が一定数いるみたいなので
そういった人達が参考にするための記事です。


こちらの記事の続きです。
https://qiita.com/Hashimoto-Noriaki/items/82beae9d3d6dac11e11c

# 比較
演算子などを使った比較の方法をみていきます。

### PHPで値を調べる

```var_dump```を使うと値の解析ができます。
```php
var_dump(10);
var_dump("10");

//int(10)
//string(2) "10" と出力
```
initは```数値```のことで、stringは```文字列```のことです。
stringの後の(2)は***文字数***のことです。

### 条件式
数値などを比較をする時には使う***条件式***をRubyとPHPで比較しながら見ていきます。
```==```は比較したものが等しいかをチェックします。

⚫︎```Ruby```

```rb
puts 100 == 100
puts 100 == 1000

#true
#falseと出力
```

⚫︎```PHP```

```php
var_dump(100 == 100);
var_dump(100 == 1000);　と出力

//bool(true)
//bool(false)
```
```bool型```は***true(正しい)かfalse(正しくない)を表す***型です。

### 比較演算子
比較記号のことを```比較演算子```と言いますが、***RUbyもPHPも共通***です。

```rb
x == y  #両者が等しいか
x < y   #xよりyが大きい
x <= y  #x以上
x >= y  #x以下
X!= y   #xとyは違う
```

### PHPで型を比較する
PHPでの型の比較方法を見ていきます。
型の比較では　```===```を使います。

```php
var_dump(100 == "100");
var_dump(100 === "100");

//bool(true)
//bool(false)
```
***==の場合***は```型の比較はしない```のでtrueになっています。
***===の場合***は```型の比較をするので```falseになっています。

Rubyで調べてみたらこのような機能はなかったです。


# if文(条件分岐)
if文を使った条件分岐(これはもし〜なら〜で処理するみたいな仮定法みたいな文)
を見ていきます。
if-elseif-elseを使ったポケモンのレベルに関するif文を見ていきます。

⚫︎Ruby

```rb
pokemon_level = 70

if pokemon_level >= 80
    #レベル80以上
    puts  "めっちゃ強い"
 elsif pokemon_level >= 50
    #レベル50以上
    puts  "強い"
 elsif pokemon_level >= 30
    puts  "普通"
else 
    #レベルが30に行かないポケモン
    puts "弱い"
end

#レベル70なので強いと出力
```



⚫︎PHP

```php
$pokemon_level = 70;

if($pokemon_level >= 80){
    //レベル80以上
    echo "めっちゃ強い";
} elseif ($pokemon_level >= 50){
    //レベル50以上
    echo "強い";
} elseif ($pokemon_level >= 30){
    echo "普通";
}else {
    //レベルが30に行かないポケモン
    echo "弱い";
}

//レベルが70なので今回は強いと出力
```
### 条件分岐をRubyとPHPで比較
Rubyと比べて***PHPは```{}や()```を***if文やelseの後に入れたり、
***elsifがelseifになったり***、***Rubyではendをつけたり***
違いがあります。

### 条件式の記号
条件式の記号の使い方もみていきます。

まず***AND条件***の```&&```からです。

⚫︎```Ruby```
```rb
puts 50 <=  i && i < 80
#どちらも　trueなのでtrue
#そうでない場合はfalse
```
⚫︎```PHP```
```php
50 <=  $i && $i < 80
```
***どちらも　trueならtrueでそうでない場合はfalse***になります。

次に***OR条件***の```||```を見ていきます。

⚫︎```Ruby```
```rb
a < 100 ||  b < 100
```
⚫︎```PHP```
```php
$a < 100 ||  $b < 100
```
***どれかがtrueならtrueになります。全てfalseならfalseになります***。

# 配列
次に配列を見ていきます。

⚫︎```Ruby```
```rb
animal = ["犬","猫","猿","ライオン"]
puts  animal[0] #犬が出力
```

⚫︎```PHP```

```php
$animal = ["犬","猫","猿","ライオン"];
echo $animal[0]; //犬が出力
```
# ハッシュ(連想配列)
次にハッシュ(連想配列)を見ていきます。

⚫︎```Ruby```
```rb
language = {"lan1" =>"日本語","lan2" => "英語","lan3" => "中国語","lan4" => "フランス語"}
puts language["lan1"] #日本語と出力
```

⚫︎```PHP```
```php
$language = ["lan1" =>"日本語","lan2" => "英語","lan3" => "中国語","lan4" => "フランス語"];
echo $language["lan1"]; //日本語が出力
```

### 補足
lan1などのkeyの部分は自分や他の人がわかりやすいもので、自由に選べます。
key1などでだとわかりやすそうですね。
ちなみに文字列の部分はvalueです。

### Rubyのシンボル

⚫︎```Ruby```
連想配列の書き方で```シンボル```という```文字列を:```にして簡単に書けるようにしたものです。
毎回""をつけるとめんどくさいのでこのように簡略化した書き方もあります。

```rb
language = {:lan1 =>"日本語",:lan2 => "英語",:lan3 => "中国語",:lan4 => "フランス語"}
puts  language[:lan1]　#日本語と出力
```
こっちの書き方でも可能です。

```rb
language = {lan1: "日本語",lan2:  "英語"}
puts language[:lan1] #日本語と出力
```

***PHPでもこの書き方を試したのですが、シンボルに書けなかったです。***
もし知っている方がいたら教えてください。

### いろんな書き方
いろんな配列の書き方を見ていきます。

1.***多次元配列***
***配列の中に配列が書けます。***

⚫︎```Ruby```
```rb
 [[100],[200]]
```
⚫︎```PHP```
```php
[[100],[200]];
```

2.***配列の中にハッシュ***
配列の中にハッシュを入れることができます。

⚫︎```Ruby```

```rb
[{"key1" => "Ruby"}]
```

⚫︎```PHP ```
```php
[["key1" => "PHP"]];
```

3.***ハッシュの中に配列***
ハッシュの中に配列を入れることができます。

⚫︎```Ruby```
```rb
{"key1" => ["Ruby"]}
```

⚫︎```PHP ```
```php
["key1" => ["PHP"]];
```

実務に入った時にこんな感じの書き方を実際見ました。

# 繰り返し処理
eachなどを使った繰り返し処理を見ていきます。


### each文とforeach文

⚫︎```Ruby```
```rb
language  = ["日本語","英語","中国語","フランス語"]
language.each do |lang|
    puts  lang
    end
#日本語
#英語
#中国語
#フランス語 と出力
```

⚫︎```PHP ```
```php
$language = ["日本語","英語","中国語","フランス語"];
foreach($language as $lang){
    echo $lang;
};
//日本語
//英語
//中国語
//フランス語 と出力
```

### each文の両者の違い
***Ruby***は```each```を使いますが、***PHP***は```foreach```を使います。
それぞれの書き方も異なってくるので比較します。

⚫︎```Ruby```
```rb
配列.each do |変数|
#ループ処理
end
```

⚫︎```PHP```

```php
foreach($配列　as $変数){
//ループ処理
}
```
両者を比較するとだいぶ書き方が違いますね。

# ハッシュの繰り返し処理

⚫︎```Ruby```
```rb
language = {"佐藤" =>"日本語","マイク" => "英語","王" => "中国語","エマ" => "フランス語"}

language.each do |key,value|
    puts "#{key}さんは#{value}が話せます。"
end
#佐藤さんは日本語が話せます。
#マイクさんは英語が話せます。
#王さんは中国語が話せます。
#エマさんはフランス語が話せます。  と出力
```

⚫︎```PHP```

```php
$language = ["佐藤" =>"日本語","マイク" => "英語","王" => "中国語","エマ" => "フランス語"];
foreach ($language as $key => $value){
  echo "{$key}さん{$value}が話せます。";
}
//佐藤さんは日本語が話せます。
//マイクさんは英語が話せます。
//王さんは中国語が話せます。
//エマさんはフランス語が話せます。 と出力
```
***putsとechoで出力する時に、変数を出力する時に#を使うか使わないかの違い***があります。
他は上の繰り返し処理と同じです。

## ループ処理のスキップ(nextとcontinue)
普通のループ処理だと変数の中身がそのまま出力されますが、
***Ruby***で```next```、***PHP***で```continue```を
使うと***ループ処理のスキップ***ができます。

例えば中国語を出力させないでループ処理をする場合を見ていきます。

⚫︎```Ruby```
```rb
language = ["日本語","英語", "中国語", "フランス語"]
language.each do |lang|
     next if lang ==  "中国語"#lang == "中国語"がtrueならnextを実行
     puts lang
end
#日本語
#英語
#フランス語 と出力
```


⚫︎```PHP```
```php
$language = ["日本語","英語","中国語","フランス語"];
foreach($language as $lang){
    if($lang == "中国語"){
        continue;
    }
    echo $lang;
}
//日本語
//英語
//フランス語 と出力

```
書き方がそれぞれ違うので確認していきましょう。


# 参考資料
下の動画を元に作成しています。

https://www.youtube.com/watch?v=8NI57SrDiVw&list=PL-1KBX2gDRuiDf7R-YR4NjFf_nYu3RG3y&index=15

https://www.youtube.com/watch?v=J_pASVQXElA