LABO IWASAKI

PHPの配列arrayでimplodeやexplode

ARRAY

苦手です。というか嫌いです。
でもPHPを使うならarrayは重要。
頑張って理解するとすごく便利です。

特にimplodeexplodeは良く使う。
cookieに配列を保存したい時とかない?
僕はその時に頑張って覚えました。

配列

array

配列と聞いただけでアレルギーが出そうです。
でもすごく便利でよく使います。

「$val = array();」で変数を配列にします。

こうすると、その変数にカンマ区切りで色々な値を入れれる訳ですね。
まぁ、そんな基本を説明する記事ではありません。
いや、基本かも知れないけど、主に「配列嫌い!」と思ったところをメモしていたので、記事にしてみました。

今回は「implode」と「explode」などを書こうかと思います。

あとは個人的によく分からなかった事をかいつまんでいきます。

こういう記事ってすごく出来る人が書いてる事が多いけど、苦手な人が書くのもいいと思う。

配列が苦手な人向けに、配列が苦手な人が、自分のつまずいたポイントを書く感じです。

配列操作色々

Array

$a = array("りんご","ごりら","らっぱ","ぱんだ");    //この配列から
$b = array("りんご","ぱんだ");    //この値を
$c = array_diff($a,$b);    //削除する

地味によく使います。
こう見ると全然難しくないのに何故苦手だったのか…。

$ar = array("PHP", "CGI", "PERL");

  if (in_array("PHP", $ar)) {
     echo "配列に「PHP」は存在します。";
  }

分かりやすく「echo」で表示してますが、プログラムに組み込む事が多いです。
条件分岐してそれぞれ処理を書く感じですね。

$ar = array("3","1");
asort($ar);
結果=> 1,3
$ar = array("1","3");
arsort($ar);
結果=> 3,1

並び替えもよく使います。

$ar = array("A","B","c");
array_unshift($ar,"0");
▶$ar = "0"  "A"  "B"  "C"

array_unshift($ar,"0","0");
▶$ar = "0" "0" "A"  "B"  "C"

文字列を配列に変換

Explode

Cookieに配列を保存したい時ってありませんか?
そんな時に使えるのがこの「explode」です。
SESSIONだとブラウザ閉じると消えちゃうし、Cookieに保存したい。

setcookie("fav","1/2/4/7/10",time()+60*60*24);
           名前      データ    保存期間

$fav = $_COOKIE["fav"];
この時点で$favの値は「1/2/4/7/10」となっている

まず、こんな感じで「/」で区切って保存します。
これを配列にしたいと思います。

$ck = explode("/", $fav);

この時「$ck」は「/」が削除され「/」で区切られていた値ごとに配列として変換され
$ck = array(1, 2, 4,7,10);  こうなっている。
つまり $ck[1] の値は「2」となる。

カンマの代わりにスラッシュを代用しておく感じです。
次は逆変換します。

配列を文字列にしてCookieに保存

cookie & array

次に、配列をスラッシュ区切りの文字列に変換してCookieに保管します。
変数 $favo には「2,4,10」という値が配列で入っています。

$favo = array('2','4','10');

この $favoの配列の値をスラッシュ区切りの文字列にします。
その後、Cookieに保存します。

$favorite = implode("/" , $favo);

setcookie("fav","$favorite",time()+60*60*24);

つまり$_COOKIE["fav"]の値は「2/4/10」

こんな簡単だったのに何故かすごく苦手だった。
これを覚えてからサイトに訪問した人に会員登録なしで「お気に入り」の記事IDとかを記録できるようになった。
(このサイトでは使用してません)

DBを使って応用

DB & array

では、Cookieに入ってる配列の値が「お気に入り記事のID」だとします。
その際、お気に入り記事を一覧する時にDBから記事を参照します。
データベース「test」に記事の ID と タイトル と URL が入っているとします。
それを参照して、すべてリンク付きで表示します。

//-----------------------------
// 配列の分だけ foreach
//-----------------------------
foreach ($fav as $favorite) {
//-----------------------------
// DBのデータを引っ張ってくる
//-----------------------------
    $stmt = $pdo -> prepare("SELECT * FROM test WHERE id=:id");
    $stmt -> bindParam(':id', $favorite, PDO::PARAM_STR);
    $stmt -> execute();

         if ($row = $stmt -> fetch()) {
            $favo_title = $row["title"];
            $favo_url = $row["url"];
         }
//-----------------------------
// タイトルにその記事のリンクを貼る
//-----------------------------
echo ''.$favo_title.'';
echo '
'; }

もっといいやり方があるかも知れませんが、参考までにどうぞ。
データベースにPDOを使って色々やるのはコチラに書いています。
「PDOを使ってMySQLに接続してINSERTやCOUNT、参照など色々やる」

配列の内容をCOUNTする

count & array

カウント自体は簡単なんですが、配列の中に配列が入っている場合がもぅ…

$fruitという変数に「りんご メロン トマト」が入っているとする。

   $fruit = array('りんご', 'メロン', 'トマト');
この数を数える場合
   $count1 = count($fruit);
とすると
$count1 に $fruit の値の数(項目数)が入る。
つまり$count1は「3」となる

じゃあ、配列の中に配列が入っている場合。
その「中の配列」にも複数の値が入ってる訳です。
それもカウントしたいと思います。

$fruit = array('りんご', 'メロン', 'トマト');
$food = array('肉', '魚', $fruit);

$count1 = count($food);

このように「$food」をカウントすると、「$count1」の値は「」になってる。
これは「$fruit」も1の項目としてカウントしているから。

次にこの「count」に「COUNT_RECURSIVE」という引数を付けてみます。
すると以下のような結果が得られます。

$count2 = count($food, COUNT_RECURSIVE);

この時、「$count2」 の値は「6」になる。「5」ではない。
カウントの内容としては以下のような結果になってる。

$foodを「COUNT_RECURSIVE」でカウントした場合
以下が結果の内容

野菜   (1カウント)
魚    (2カウント)
$fruit  (3カウント)
  りんご(4カウント)
  メロン(5カウント)
  トマト(6カウント)

$fruitという「中に入ってる配列」も
1としてカウントしている。

まぁ、当然といえば当然なんですが、これがイライラした配列です。
では「$count1」と「$count2」の値だけ表示します。

 print('food 配列に含まれる項目数は'.$count1.'です
'); print('すべての値の項目数は'.$count2.'です
');      表示 food 配列に含まれる項目数は3です すべての値の項目数は6です

…うん。配列やっぱ嫌い。