【PHP第5回】配列

【PHP第5回】配列

PHPのプログラミングメモ第5回です。何回かに分けてメモを投稿していきます。なお、この記事はプログラミングメモですのでどんどん追記していきます。

【関連記事】


配列

配列とは

  • 変数(箱)を横に並べて、ひとかたまりとして見たもの
  • 配列の名前は変数と同じルール
     array()の中にカンマで区切って値を入れる
  • 配列に値を入れるには、[]とするか、[]の中に番号を指定する
    (先頭の番号は0から始まる)
  • 配列の中身を取り出すには、[]の中に番号を指定する
//変数 データを1つ持てる
//配列 データを複数持てる
//$a= array(value1, value2, value3, ...);
//$a= [value1, value2, value3, ...];
//PHP5.4以降

// sample code 1
$arr_fruits = array("apple", "orange", "banana", "strawberry");
echo $arr_fruits[0].PHP_EOL;

// sample code 2
// こちらで書く方がベター
$arr_fruits = ["apple", "orange", "banana", "strawberry"];
echo $arr_fruits[0].PHP_EOL;

// output
apple

連想配列

連想配列とは

連想配列

  • 配列と同様に、複数の値を持つ変数
  • 配列との違いは、キーが数字ではなく文字列であること
  • 配列の名前は変数と同じルール
     array()の中にカンマで区切って「キー名 => 値」の組み合わせを入れる
  • 連想配列に値を入れるには、[]の中にキー名を指定する
    (先頭の番号は0から始まる)
  • 配列の中身を取り出すには、[]の中にキー名を指定するか番号を指定する

// sample code 1
$array = array( 
  "foo" => "bar",
  "bar" => "foo",
);

echo $array["foo"];

// 実行結果
bar

// sample code 2
// []を使う
// こちらで書く方がベター(連想配列や多次元配列で可読性が高いため)

$userScores = [
  "ono" => 90,
  "baba" => 80,
  "kogure" => 70,
];

echo $userScores["ono"];

// 実行結果
90

>> 配列


多次元配列

  • 配列を値として持つ配列
  • 配列の中にさらに配列がある状態(入れ子)

// sample code
$users = [
  [
  "login_id" => "tanaka5678",
  "password" => "22222222",
  "name" => "tanaka",
  "birthday" => "1980-12-31"
  ],

  [
  "login_id" => "komikomi",
  "password" => "333333333",
  "name" => "komiya",
  "birthday" => "2000-03-31"
  ],

  [
  "login_id" => "takagiiiii",
  "password" => "44444444",
  "name" => "takagi",
  "birthday" => "1995-6-10"
  ],
];

echo "{$users[1]["name"]}さんのログインIDは{$users[1]["login_id"]}です。";

ハンズオン 1

echo "----------",PHP_EOL,"sample declare arrays",PHP_EOL,"----------",PHP_EOL;
// declare arrays
$int_arr = [7];
$str_arr = ["apple", "banana", "grape"];

var_dump($int_arr);
var_dump($str_arr);


// sample 2-1
// 宣言
$array_each = [];

// それぞれの要素に代入
$array_each[] = 1;
$array_each[] = 2;
$array_each[] = 3;


// sample 2-2
// 宣言と代入を一緒に実施
$array_batch = [1, 2, 3];

var_dump($array_each);
var_dump($array_batch);


echo "----------",PHP_EOL,"sample foreach",PHP_EOL,"----------",PHP_EOL;

// 各要素の値を順次出力
foreach ($array_batch as $value){
    echo $value;
    echo PHP_EOL;
}


echo "----------",PHP_EOL,"sample array use link",PHP_EOL,"----------",PHP_EOL;

// link
// 参照渡し
// foreach内で値を変更
// あまり使わない方が良いとされる
foreach ($array_batch as &$value){
    echo $value;
    echo PHP_EOL;
    $value = $value * 10;
}
unset($value);
var_dump($array_batch);

// reassignment
// 配列に再代入
foreach ($array_each as $index => $value){
    echo $value;
    echo PHP_EOL;
    $value = $value * 10 ;
    $array_each[$index] = $value;
}

var_dump($array_each);

ハンズオン 2

// sample code 2-1
// 0から9までの数字を配列に代入
// インデックスが偶数番目の合計値と奇数番目の合計値をそれぞれ出力
​
$arr_nums = [0,1,2,3,4,5,6,7,8,9];
$sum_even = 0;
$sum_odd = 0;
​
foreach ($arr_nums as $index => $value){
  if ( $index % 2 === 0 ) {
    $sum_even += $value;
  } else {
    $sum_odd += $value;
  }
}
​
echo $sum_even.PHP_EOL;
echo $sum_odd.PHP_EOL;


// sample code 2-2
// Integer(整数)の配列を渡すと、配列の中身が2倍される関数
// validationも作成する(空白の場合、配列以外の場合、整数以外の場合にエラーを返す)

/*
* varidation
*    配列でない場合 not array
*    空の場合    empty
*/

function calc2times($nums){
    if (!is_array($nums)) {
        echo "not array";
        echo PHP_EOL;
        return false;
    }

    if (empty($nums)) {
        echo "empty";
        echo PHP_EOL;
        return false;
    }
    
    if (in_array(false, filter_var($nums, FILTER_VALIDATE_INT, FILTER_REQUIRE_ARRAY), true)) {
        echo "not integer";
        echo PHP_EOL;
        return false;
    }
    
    foreach ($nums as $value) {
        echo ($value * 2);
        echo PHP_EOL;
    }
}

// 引数ごとに確認してみる
// calc2Times([1,3,5,7]);
// calc2Times(1);
// calc2Times([]);
calc2Times([1,2,3,'dog']);


// sample code 2-3
// 2つのInteger(整数)の配列を引数にもち、それぞれ同じ順番の値が合計された配列を作る関数
// 配列を返り値として持つ
// 作られる配列は2つの入力された配列のうち少ない個数の配列の個数とする

$nums_1 = [1, 2, 3, 4];
$nums_2 = [1, 2];

function sum_arr($nums_1, $nums_2) {
    $total_1 = count($nums_1);
    $total_2 = count($nums_2);

    //件数を比較 → 小さい方を格納する
    if ( $total_1 < $total_2 ) {
        $max = $total_1;
    } else {
        $max = $total_2;
    }

    //処理
    for ($i = 0; $i < $max; $i++) {
        $sum_array[] = $nums_1[$i] + $nums_2[$i];
    }
    return $sum_array;
}

$result = sum_arr($nums_1, $nums_2);
print_r($result);

ハンズオン 3

// 以下の配列を出力してみる
$test_array = [[["a", "a", "a"], ["a", "a", "a"], ["a", "a", "a"]], [["a", "a", "b"], ["a", "a", "a"]]];

// sample code 3-1
// インデックスを明示して「b」を出力
echo $test_array[1][0][2];
echo PHP_EOL;

// result
b

// sample code 3-2
// forを使って出力してみる
for ( $i = 0; $i < count($test_array); $i++ ) {
    for ( $j = 0; $j < count( $test_array[$i] ); $j++ ) {
        for ( $k = 0; $k < count( $test_array[$i][$j] ); $k++ ) {
            print_r( $test_array[$i][$j][$k] );
            echo PHP_EOL;
        }
    }
}

// sample code 3-3
// foreachを使って出力してみる
foreach ( $test_array as $key1 => $value1 ) {
    foreach ( $value1 as $key2 => $value2 ) {
        foreach ( $value2 as $key3 => $value3 ) {
            echo $value3;
            echo PHP_EOL;
        }
    }
}

//result
a
a
a
a
a
a
a
a
a
a
b
a
a
a

 

配列を書くときの注意点

配列はarray()でなく、[]を使うのがベター

  • この二つは同じもので、結果は変わらない
  • シンプルな記述になり、配列の構造が明確になる

その他

  • 配列はリソースを消費する場合があるので、可能な限り最小限にする
  • 配列のインデックスは「0」から始まる
  • 配列は宣言的に記述する/そのほうが構造を把握しやすい