PHP学習 ⑤

PHP入門 最終章

PHPプログラミングの初歩学習のフィナーレ。
連想配列の基礎と、配列のソートについて学習する。


まず連想配列の概念について実務でもよく使うのでしっかり学習しておく。
連想配列においてはkeyが文字列である事、valueは数字でも文字列でも可。

利用例:RPGのアイテムの所持数を配列で管理する

         key   value

$item = “鉄の剣” 2
     “藁の盾” 1
“薬草”
      ”羽根”  1 

valueは同じ数字、文字列が入っても大丈夫。
keyは重複不可(変数名のようなもので上書きされてしまう)



連想配列の基本操作

$配列名 = array(“キー名1” => 要素1, “キー名2” => 要素2, “キー名3” => 要素3…);
連想配列に代入したい用はカンマ区切りで連ねる事で複数代入できます。
キーの文字列の文字コードに注意。

$item = array("剣" => 2, "盾" => 1, "薬" => 3);
改行してもセミコロンが出てくるところまでは1行とみなされるので見やすくする

$item = array("剣" => 2,
         "盾" => 1,
         "薬" => 3
);

print_r($item);で出力できる

要素の追加、書き換えも通常の配列と同様

要素追加
$item[“薬”] = 6;

要素の書き換え
$item[“薬”] = 3;

削除
unset($item[“盾”]);

以上、動画を見ながら出力結果と見比べながら確認する。
https://paiza.jp/works/php/primer/beginner5/2130



演習 下記のアイテム名をkeyに、所持数を数値としてvalueに代入した連想配列を
作成し、print_rで内容を出力してください。

■連想配列代入する値
ショートソードを12個 銅の盾を4個 布の服を7個

<?php
// ■連想配列代入する値
// ショートソードを12個
// 銅の盾を4個
// 布の服を7個
$item = array("ショートソード" => 12, "銅の盾" => 4, "布の服" => 7);
print_r($item);

?>

$team のkeyが「木こり」のvalueを「木を切る職業」で上書きして、
$team["木こり"] = "木を切る職業";

配列 $team にkeyが「狩人」、valueが「鳥獣をとる猟師」という要素を追加
$team["狩人"] = "鳥獣をとる猟師";

// $team のkeyが「スライム」の要素を削除して
unset($team["スライム"]);

課題「連想配列から特定要素を取り出す」
エディターエリアのプログラムを元に
配列 $team のkeyが「戦士」のvalue要素を出力してください。
エディターエリアに書かれているプログラムは、標準入力の値を/で分割し、手前の要素をkeyとして、
後の要素をvalueとして連想配列$teamに代入するプログラムです。

ヒント
まずはprint_rで何が代入されているか確認して
入力されたものがどのように連想配列に代入されているか見てみると良い。

 入力される値
勇者/勇敢な戦士で、魔王を倒す職業
戦士/剣や斧など直接攻撃を得意とする職業
魔法使い/魔法を使える、高い知識、技能を持つ職業

<?php
// 標準入力を3行取得
for($i=0 ; $i<3 ; $i++){
$input = trim(fgets(STDIN));
// 入力値を/で分割
$key_value =explode("/", $input);
// 手前の要素をkeyとして、後の要素をvalueとして連想配列に代入
$key = $key_value[0];
$value = $key_value[1];
$team[$key] = $value;

}
// ここから下に記述 
// $team のkeyが戦士のvalueを出力
print_r($team);

?>




???????????????????????





では 配列の並べ替え について学習する。

配列を扱うときに非常に良く使う
配列のソート(値の並べ替え)sort,rsortをしっかり理解する

sort(配列);
配列のvalueを小さい順(1,2,3,,や あ,い,う,, という順)に並び替えます。

rsort(配列);
配列のvalueを大きい順(3,2,1 や う,い,あ という順)に並び替えます。


文字よりも数字が優先される
日本語よりもアルファベットが優先される
ちなみに日本語ソートはひらがなカタカナ漢字全角数字の順(文字コード順)
漢字の場合は読みではなく文字コード順となるので要注意。


演習「データを取得して並べ替えて出力してみよう1」
標準入力で複数行のデータが与えられます。
全てのデータを取得し、小さい順に並べ変えてprint_rで出力する。
<?php
while($input = fgets(STDIN)){
    $array[] =trim($input);
}
sort($array);
print_r($array);
?>


演習「データを取得して並べ替えて出力してみよう2」
標準入力で1行のcsv形式データ(カンマ区切り)が与えられます。
カンマ[,]で分割して攻撃力が高い順に並び替えてprint_rで出力してください。
 入力される値
攻撃力:23/ショートソード,攻撃力:45/バスタードソード,攻撃力:34/ロングソード,攻撃力:10/ダガー
<?php
$input = trim(fgets(STDIN));
$array = explode(",", $input);
rsort($array);
print_r($array);
?>


連想配列の並べ替えについても学習する。
asort,arsort,ksort,krsort,に習熟する。

配列のソートの書き方
sort(配列);
配列のvalueを小さい順(1,2,3,,や あ,い,う,, という順)に並び替えます。
連想配列に対して実行するとキーが失われるので注意。

asort(配列);
連想配列のvalueを小さい順(1,2,3,,や あ,い,う,, という順)に並び替えます。

arsort(配列);
連想配列のvalueを大きい順(3,2,1 や う,い,あ という順)に並び替えます。

ksort(配列);
連想配列のkeyを小さい順(1,2,3,,や あ,い,う,, という順)に並び替えます。

krrsort(配列);
連想配列のkeyを大きい順(3,2,1 や う,い,あ という順)に並び替えます。





演習「データを取得して並べ替えて出力してみよう」
標準入力で複数行のデータが与えられます。
各行のデータはカンマ区切りで [アイテム名、攻撃力] の形式となっているので、
アイテム名をkeyに、攻撃力をvalueとして連想配列に代入してください。
※$item["ロングソード"] = "攻撃力:11" と言う状態。

その後、攻撃の大きい順に並び替えてprint_rで出力するプログラムを作成してください。

 入力される値
ショートソード,攻撃力:23
バスタードソード,攻撃力:45
ロングソード,攻撃力:34
ダガー,攻撃力:10





????????????????




★foreachで配列の値を取り出す
foreachループを使い、配列の値を取り出し、値毎に処理するやり方について理解する

foreachは配列の中身を順番に且つ全部取り出し要素ごとに何か処理をしたい時に便利な構文。
例えば配列に都道府県名を入れておいて、foreachでプルダウンメニューとして加工し表示するなど。

 foreachの書き方
foreach(配列 as バリューを代入する変数){
処理
}
 配列は、ループさせたい配列名を記載します。
 バリューを代入する変数とは、配列のバリューの値をループ毎に上書き代入する変数名です。

e.g.

<?php
$array = array(“A”, ”B”, ”C”);
foreach($array as $value){
echo “<strong>”.$value.”</strong><br>\n”;
}
?>


print_rとさほど変わりないように思えるが、
取り出した要素一つ一つにhtml処理ができている!
個別に値を処理することができるので
間にif文を入れることもできるし、
変数名も$value以外を取ることができる。
よく使うのできっちり覚えよう。



「foreachループの練習1」
右側のエディターエリアのプログラムを元に、
foreachループで$item配列のvalue全てを一つづつ
\nを末尾に付けて改行しながら出力してみましょう。

 期待する出力値
ショートソード
ロングソード
ブレードソード
バスタードソード

<?php
$item = array("ショートソード", "ロングソード", "ブレードソード", "バスタードソード");
// foreachループで$item配列のvalue全てを一つづつ
// \nを末尾に付けて改行しながら出力してみましょう。
foreach($item as $value){
    echo $value."\n";
};
?>



またforeachループで、valueだけでなくkeyも取得することができる
<?php
$array = array("勇者", "魔法使い", "遊び人");
foreach($array as $key => $value){
echo $key.":<strong>".$value."</strong><br>\n";
}
?>


これは連想配列でも同様。
<?php
$array = array("勇者" => 41,
       "魔法使い" => 14,
       "遊び人" => 23);

foreach($array as $key => $value){
echo $key."のHPは<strong>".$value."</strong>です。<br>\n";
}
?>



演習「foreachループでkeyを使う1」
右側のエディターエリアのプログラムを元に、
$itemの中身を「弓矢は1200円です。\n」というように出力する
foreachループを書いてみましょう。
$itemにはkeyに商品名、valueに価格(整数のみ)が代入されています。

 期待する出力値
ショートソードは2000円です。
ロングソードは5000円です。
鉄の盾は1600円です。
鎖かたびらは2800円です

<?php
$item = array(
"ショートソード" => 2000,
"ロングソード" => 5000,
"鉄の盾" => 1600,
"鎖かたびら" => 2800
);

// ここから下に記述
// 弓矢は1200円です。\n と言うように出力。

foreach($item as $key => $value){
    echo $key."は".$value."です。\n";
}
?>




★連想配列やforeachを利用してRPGのアイテムリストを再現する
https://paiza.jp/works/php/primer/beginner5/2135


<?php
$item_img = array(
    "剣" => "http://paiza.jp/learning/images/sword.png",
    "盾" => "http://paiza.jp/learning/images/shield.png",
    "回復薬" => "http://paiza.jp/learning/images/potion.png",
    "クリスタル" => "http://paiza.jp/learning/images/crystal.png"
);
$item_order = array("クリスタル", "盾", "剣", "回復薬");

//並び順配列をループさせてアイテム名を表示
foreach($item_order as $item_name){
    //アイテム名を元に画像用配列から画像ファイル名を取得
    echo "<img src=".$item_img[$item_name].">";
    echo $item_name."<br>\n";
}
?>

このような配列の使い方は実務でも割とよく使うのでサクサク書けるように慣れよう!


演習「画像を順番に出力する」
エディターエリアのプログラムを元に、
$itemのvalueとして代入されている画像urlを元に、
1行づつHTMLで画像を表示してみましょう。

HTMLで画像を1行つう表示する場合は以下のようにimgタグを利用します。
今回は1つづつ改行させたいのでbrタグとその後に\nの改行コードを入れてください。
<img src=URL><br>\n

解答ech
<?php
$item_img = array(
    "剣" => "http://paiza.jp/learning/images/sword.png",
    "盾" => "http://paiza.jp/learning/images/shield.png",
    "回復薬" => "http://paiza.jp/learning/images/potion.png",
    "クリスタル" => "http://paiza.jp/learning/images/crystal.png"
);
//ここから下に記述
foreach($item_img as $key => $value){
    echo "<img src=".$value."><br>\n";
}
?>


演習「アイテムリストを作ってみよう」
右側のエディターエリアのプログラムを元に、アイテムリストを作ってみましょう。
標準入力で複数行のアイテム名の入力があります。それを元に
$item_imgで定義された画像を改行せず順番に出力してみましょう。

※標準入力で与えられるアイテム名は、$item_imgに無いアイテムは
出てこないものとします。

<?php
$item_img = array(
    "剣" => "http://paiza.jp/learning/images/sword.png",
    "盾" => "http://paiza.jp/learning/images/shield.png",
    "回復薬" => "http://paiza.jp/learning/images/potion.png",
    "クリスタル" => "http://paiza.jp/learning/images/crystal.png"
);
// ここから下に記述
while($input = fgets(STDIN)){
    $array[] = trim($input);
}
foreach($array as $value){
        echo "<img src=".$item_img[$value].">";  
}  
?>


以上でPHP入門は終了。

次回以降、これまでのところで不明瞭な部分が残らないように一通り確認の上
paiza動画学習ページ上の演習問題で解けていない問題を中心に取り組んでから
PHP基礎編に取り掛かりたいと思う。

基礎編では、実際の問題を題材としてプログラミングをはじめる前の処理手順の整理、
ロジック構築のしかた、また処理毎のデバッグしかたを手順を追って学習できる。

コメント

  1. このコメントは投稿者によって削除されました。

    返信削除
  2. 演習「データを取得して並べ替えて出力してみよう」

    while($input = fgets(STDIN)){

    $key_value = explode(",", trim($input));
    $key = $key_value[0];
    $value = $key_value[1];
    $team[$key] = $value;
    }


    arsort($team);
    print_r($team);

    maybe.....

    返信削除

コメントを投稿

このブログの人気の投稿

PHP学習 ③

PHP学習 ④

LINEアカウント凍結事件②