[PHP7.4.16] CSVからKeyとValueの連想配列を作る

まず、CSVにデータがある

このデータを元に連想配列を作る

$data = [];
$fp = fopen("Book.csv", "r");
while(! feof($fp)){
	$csv = fgets($fp);
	$csv = trim($csv,'"');
	$csv = mb_convert_encoding($csv, "UTF-8", "utf-8");
	$csv = str_replace('"','',$csv);
	$array = explode(",",$csv);
	$data[$array[0]] = $array[1];
}

echo "<pre>";
var_dump($data);
echo "</pre>";

まあOKっぽい。。

[PHP7.4.11] 配列の先頭から複数の値を取り出す

$animals = ["cat", "dog", "tiger","rabbit"];
$animals = array_slice($animals, 1, 3);

var_dump($animals);

array(3) { [0]=> string(3) “dog” [1]=> string(5) “tiger” [2]=> string(6) “rabbit” }

例えば、値が2つしかなくて、3つ取り出そうとしたら、

$animals = ["cat", "dog"];
$animals = array_slice($animals, 0, 3);

var_dump($animals);

array(2) { [0]=> string(3) “cat” [1]=> string(3) “dog” }

値がないときはnullとなる。
OK!

[PHP 7.4.11] CSVパスワードリストをハッシュ化したパスワードリストに変換

csvでパスワードリストを読み取り、1行ずつハッシュ化したパスワードに変えて、新しいハッシュ化リストcsvを作る。
ハッシュ化はpassword_hash($value, PASSWORD_DEFAULT);で書く。

if (($handle = fopen("list.csv", "r")) !== FALSE) {
    while (($data = fgetcsv($handle))) {
        foreach ($data as $value) {
        	$hashedpassword = password_hash($value, PASSWORD_DEFAULT);
            $list[] = array($value, $hashedpassword);
        }
    }
    fclose($handle);
}

$fp = fopen('new_list.csv', 'w');
foreach ($list as $fields) {
    fputcsv($fp, $fields);
}
fclose($fp);

echo "done";

password1,$2y$10$9Bonz2Ou5aJ1eOJl8Nf9eOipsRRWLpPbesCn.05J.W/pu0vItQ2mW
password2,$2y$10$d4OP/5HRbNWnS2BJS7w4puvWWXCj4Y2dxAmp0wS2E84Mpvc2udCqK
password3,$2y$10$u7IghXiVsUsVarK.n46X3eqP/uAzYMmtPCXLynXtYYy5nUlSCC0b6
password4,$2y$10$qgaJzGVySJT6ll7k3I0ZwewX/ia.a2KVK3XLjH/VJuSXJ4nzdi4Fy
password5,$2y$10$VcejFdWMC6M/hI4BRZfyyeglttkqzbO41TZUexek6b58rxejgYcKG
password6,$2y$10$.lhQys3h4ukEGxn8azvzDu76l0KHNvjZYxAHfPcLu3zvshbHV78oC
password7,$2y$10$KVWoquH7WRj1bDn2l88vo.N845A4vwvuguMxRPX1G/m6uF9q63A5C
password8,$2y$10$PFDr/P4fpC0kmxQofbfb0.jHGDvQqJoRe8RPCyQlYkDozCLWhjCLy
password9,$2y$10$ZAvichguRHYMkc42fPVXVex8x7xp9/by/BDmOVaW6vRpvMSr7dIm6
password10,$2y$10$L09R/P2BX2ougk3rxHVqWelI/rJrFlTlkVr4RE7U/chw7tWZob1gu

$list[] = array($value, $hashedpassword); のところで、$hashedpasswordだけの配列を作るときは、$list[] = $hashedpasswordではなく、$list[] = array($hashedpassword);とする。

Ok, Not bad, keep going

[PHP 7.4.11] 連想配列で値を扱う

普通の連想配列です。

$sales =
	[
		"a" => 200,
		"b" => 300,
		"c" => 400
	];

var_dump($sales);

array(3) { [“a”]=> int(200) [“b”]=> int(300) [“c”]=> int(400) }

$key と $valueがあり、連想配列の中に$keyがなければ追加していく。
arsortで降順でソートする。

$key = "d";
$value = 250;

$sales =
	[
		"a" => 200,
		"b" => 300,
		"c" => 400
	];

if($sales[$key] !== null){
	$sales[$key] += $value;
} else {
	$sales += array($key => $value);
}

arsort($sales);
var_dump($sales);

array(4) { [“c”]=> int(400) [“b”]=> int(300) [“d”]=> int(250) [“a”]=> int(200) }

なんかOKっぽいな。多分。

[PHP 7.4.11] 先頭からの0取り処理(0埋め処理の逆)

0埋め処理(sprintf)とは逆に、文字列先頭からの0取り処理を実装したい。

### intにキャスト

$str = "000001";
echo (int)$str;

-> 1

### ltrim();
左端の空白を削除、第二引数で指定した文字を削除

$str = "00000222";
echo ltrim($str, 0);

-> 222

### abs();
絶対値を取得

$str = "0000033";
echo abs($str);

-> 33

int変換だと、$strの値に数値以外の値が入っていた時に、”0″と出力されてしまうので、ltrim();を使うか。
割と奥行きのあるテーマだ。

[PHP 7.4.11] 消費税の1円以下の端数処理を考える

財務省の見解

「税抜価格」に上乗せする消費税相当額に1円未満の端数が生じる場合がありますが、その端数をどのように処理 (切捨て、切上げ、四捨五入など)して「税込価格」を設定するかは、それぞれの事業者のご判断によることとなります。

え? 要するになんでもいいの?
phpで計算するとき。

$price = 5678;
echo $price * 0.1;

-> 567.8

$price = 5678;
echo floor($price * 0.1) . "<br>"; // 切り捨て
echo ceil($price * 0.1) . "<br>"; // 切り上げ
echo round($price * 0.1) . "<br>"; // 四捨五入

567
568
568

切捨て、切上げ、四捨五入 どれでも対応はできるようです。って当たり前か。

[PHP7.4.11] 郵便番号の正規表現(ハイフン有無)

$zipcode = ["100-0001","1000001","abcdefg"];
foreach($zipcode as $data){
	if(preg_match("/^(([0-9]{3}-[0-9]{4})|([0-9]{7}))$/", $data)){
		echo $data . " is ok<br>";
	} else {
		echo $data . " is not zipcode<br>";
	}
}

ハイフン有りのみの場合は

/^[0-9]{3}-[0-9]{4}$/

電話番号

/^(([0-9]{2,4}-[0-9]{2,4}-[0-9]{3,4})|([0-9]{8,11}))$/

OK、これでカスタムバリデーションを作っていく

[aws/aws-sdk-php 3.166.2] 複数画像をphpでS3にアップロード

$ composer require aws/aws-sdk-php

require_once "vendor/autoload.php";

$bucket = '';
$key = '';
$secret = '';

$s3client = new Aws\S3\S3Client([
    'credentials' => [
        'key' => $key,
        'secret' => $secret,
    ],
    'region' => 'ap-northeast-1',
    'version' => 'latest',
]);

$file = "img/flower.jpg";

$result = $s3client->putObject(array(
	'Bucket' => $bucket,
	'Key' => 'test/flower.jpg',
	'ACL' => 'public-read',
	'SourceFile' => $file,
	'ContentType' => mime_content_type($file),
));

echo "<pre>";
var_dump($result);
echo "</pre>";

これをファイル複数一括で行いたい。
複数ファイルの取得はglobだったかな。

foreach(glob("img/*.*") as $file) {
    $files[] = $file;
}

$s3client = new Aws\S3\S3Client([
    'credentials' => [
        'key' => $key,
        'secret' => $secret,
    ],
    'region' => 'ap-northeast-1',
    'version' => 'latest',
]);

foreach($files as $file){
		$result[] = $s3client->putObject(array(
		'Bucket' => $bucket,
		'Key' => $file,
		'ACL' => 'public-read',
		'SourceFile' => $file,
		'ContentType' => mime_content_type($file),
	));
}

echo "<pre>";
var_dump($result);
echo "</pre>";

ちょっと時間かかるな。手動でやった方が良さげ。

[PHP] 拡張子不明の画像名を変数として持ち、imgフォルダ内にあれば表示

imgフォルダ内に画像が複数(数千枚)置いてあり、拡張子は不明だが、ファイル名だけ変数として持っており、該当のファイル名があればその画像を表示、無ければplaceholderの画像を表示したい。

まず画像を用意します。

拡張子分foreachで探してみたが、

$name = "cat";
$cfg = array('jpg', 'jpeg', 'png', 'gif');

foreach($cfg as $key){
	if(file_exists("img/" .$name . "." . $key)){
		echo "<img src='img/" . $name . "." .$key."' width='150px' height='100px'>";
	}
}

これだと、拡張子の配列分回さないといけないのと、画像が無ければ、placeholderの表示ができない。

globとワイルドカードを使う

$name = "cat";
$result = glob("img/" . $name . ".*");

if(in_array($result)) {
	echo '<img src="'.$result[0].'" width="150px" height="100px">';
} else {
	echo '<img src="/img/150x150.png">';
}

OK!上等!
続いて、少々細かいことを調査していきます。