#PHP覚書
PHP勉強中に知ったこと、覚えておきたいことをつらつら書いています。
適宜更新されます。
完全に自分が覚えときたいことだけ書いてるので、あんまり参考になりません。
悪しからず。
#switchの比較演算子
==と同じで、型変換してから比較するみたい。
以下のコードは期待通りの動作をしないのでNG
(といっても実際に書くことはなさそう・・・だけど)
<?php
var_dump(0 == "a"); // 0 == 0 -> true
var_dump("1" == "01"); // 1 == 1 -> true
var_dump("10" == "1e1"); // 10 == 10 -> true
var_dump(100 == "1e2"); // 100 == 100 -> true
switch ("a") {
case 0:
echo "0";
break;
case "a": // "a" は 0 にマッチするので、決してここにはたどりつきません
echo "a";
break;
}
?>
#file_get_contentsでhttps
※いろいろ調べたらいろいろ出てたので解決法だけの記載に変更しました。
file_get_contentsでAPIから値を取得しようとしたとき、
httpsを用いると以下のようなエラーが。
要するにどっかの検証ができていないというわけですね(検証関連素人すぎてよくわからんので勉強します)。
Warning: file_get_contents(): SSL operation failed with code 1. OpenSSL Error messages: error:14090086:SSL routines:ssl3_get_server_certificate:certificate verify failed in [filename]
解決方法1(※検証を回避するので非推奨)
$url = '[APIアクセス用URL]';
$arrContextOption = [
'ssl' => [
'verify_peer' => false,
'verify_peer_name' => false,
],
];
$json = json_decode(file_get_contents($url, false, stream_context_create($arrContextOption)));
var_dump($json);
解決方法2(ネットでよく見た解決法ですが、この方法でいいのかはよくわからん)
証明書(cacert.pem)を見繕って、読み込ませる。
うまいこと証明書が見つかったら、配置した場所をphp.iniに記載してやります。
[cURL]
curl.cainfo=C:\xampp\php\cacert.pem
openssl.cafile=C:\xampp\php\cacert.pem
#配列をfor文で処理
・効率の悪い書き方
第2引数でcount()してしまうと、ループのたびに配列のサイズを取得してしまうので、遅くなる。
<?php
$people = array(
array('name' => 'Kalle', 'salt' => 856412),
array('name' => 'Pierre', 'salt' => 215863)
);
for($i = 0; $i < count($people); ++$i) {
$people[$i]['salt'] = mt_rand(000000, 999999);
}
?>
・効率の良い書き方
そんな時は、インデックスの宣言と一緒にサイズを変数に格納してしまう。
第1引数は、ループの最初にしか評価されないので、いちいち配列のサイズを取得しなくなる。
<?php
$people = array(
array('name' => 'Kalle', 'salt' => 856412),
array('name' => 'Pierre', 'salt' => 215863)
);
for($i = 0, $size = count($people); $i < $size; ++$i) {
$people[$i]['salt'] = mt_rand(000000, 999999);
}
?>
まあ、連想配列ならforeach使えばいいんですけどね
#phpでフィボナッチ数列のコードゴルフ
多分これが一番短いと思います。(フラグ
<?php $i=35;$a=0;$b=1;while($i--)echo(($i%2)?($a+=$b):($b+=$a)).'<br>';