あじちゃんの備忘録。

〜ここはメモ帳です

PHPでCSVのデータを加工するときに使った関数の備忘録

改行とカンマで区切られたCSV文字列を想定し実施

f:id:azix:20180719203926p:plain

目的:与えられたCSV形式のデータから、頭2つのデータを配列として取り出す

  • こんな感じのフォームを準備
<form action="{{ action('よしなに') }}" method="よしなに">
    {{ csrf_field() }}
    <textarea name="csv" cols="30" rows="10" placeholder="CSV情報を入れてください"></textarea>
    <input type="submit" value="SEND">
    <pre>
例:
title-1, author-1, description-1
title-2, author-2, description-2
title-3, author-3, description-3
    </pre>
</form>
  • このフォームに例をそのままぶち込んで送信したものを加工する。
<?php

$csv = $request["csv"];

//改行ごとの配列
$item_groups = preg_split("/\n|\r\n|\r/", $csv);

//タイトルと著者の配列
$items = [];
$keys = ['title', 'author'];
foreach ($item_groups as $item_group) {
    $c = preg_split("/,/", $item_group); //カンマごとに配列に格納
    $chunk = array_chunk($c, 2)[0]; //前から2項目のみを配列に追加
    $changeKey = array_combine($keys, $chunk); //keyを変更
    array_push($items, $changeKey);
}

説明

  1. preg_split を使って、改行ごとに配列にする.
    正規表現は \n|\r\n|\r で、改行コードを網羅.

  2. array_chunk を使って、目的のindexまでを取得し配列にする.
    これはindex[0][1]を取り出していると言うより、2個ずつ配列を分割している.
    今回はindex[0][1]が欲しかったので、2個ずつ取り出した初めの配列を使った.

  3. array_combine を使って、配列キーを変更する.

  4. array_push を使って、結果配列に追加していく.
    -array_push

🙂💬

特筆することはないけど、よく使う配列操作の関数は覚えておきたいなと思う.
あと、配列そのものに影響するのか、返り値が目的のものなのかというところも気をつけたい.

【Guzzle】POST時のoptionの設定仕方

APIの条件が以下のようになっていて、JSONでオプションを送ってくれと言われている場合。

条件

Method: POST
uri: /{ID} //対象のIDを指定
Media type: application/json //JSONで送ってねと言われている
contents: required (array of string) //IDに対して追加する対象
<?php

$base_url = "https://hoge"; //ダミーです
$uri = "/" . $ID;
$method = "POST";

$okomes = ['contents' => ['ビタミン', 'ミネラル', '食物繊維']];

//接続
$client = new Client($base_url);
$options = [
    'json' => $okomes, // ここにぶち込むと勝手にjsonにしてくれる
    'http_errors' => false,
    'headers' => [
        'Accept' => 'application/json',
        'Content-Type' => 'application/json'
    ]
]);
$response = $client->request($method, $uri, $options);
$response_contents_json = $response->getBody()->getcontents();


🙂💬
GETだとパラメータに打ち込むことができたけど、POSTだとそれができずoptionに突っ込む必要があった。
その時にform_paramsを使ってbodyに打ち込むとBadRequest飛んできたりしてはまってしまった。
(bodyにぶち込むとWarnningでそもそもリクエストが飛ばないなど問題ありありでした。
公式ドキュメントはちゃんと読もう。
Guzzle-公式ドキュメント

【HTML】checkbox のチェックを付けていない時もパラメータを送る

  • checkbox のチェックが付いていない場合、 name も value も送信されない
<!-- 
    チェックされた場合は on が送信されるが、
    チェックされていない場合は何も送信されない。
 -->
<input type="checkbox" name="test" value="on">
  • name属性が同じ場合、後に書かれたものが優先的に送信される
<!-- 
hidden 属性で、 vlaue に off を設定しておくと、
(1)が送信され、(2)は送信されない。
 -->
<!-- (1) --><input type="hidden" name="test" value="off">
<!-- (2) --><input type="checkbox" name="test" value="on">
<!-- 
以下の場合、 test には最初(1)の off が設定されているが、
(2)の checked により value が(2)のものに上書きされ、 on が送信される。
 -->
<!-- (1) --><input type="hidden" name="test" value="off">
<!-- (2) --><input type="checkbox" name="test" value="on" checked>

🙂💬 分岐処理いっぱい書くことになるんだったら、これでサクッとやっちゃう方が私は好き。