<?php // read YAML library require 'vendor/autoload.php'; use Symfony\Component\Yaml; // declare data $data = [ 'Taro'=>['age'=>30, 'hobby'=>['Guitar','Piano']], 'Takeshi'=>['age'=>18, 'hobby'=>['Reading']], 'Arisa'=>['age'=>16, 'hobby'=>['Walking','Tea']], 'Sara'=>['age'=>22, 'hobby'=>['Sleeping']] ]; $file = "serialize-test.yaml"; $dumper = new Yalm\Dumper(); $yaml = $dumper->dump($data); file_put_contents($file, $yaml); $yaml2 = file_get_contents($file); $yaml_p = new Yaml\Parser(); $data2 = $yaml_p->parse($yam12); foreach ($data2 as $name => $v) { $age = $v["age"]; $hobby = $v["hobby"][0]; if (isset($v["hobby"][1])){ $hobby .= " ".$v["hobby"][1]; } echo "[$name] $age $hobby\n"; }
Month: August 2016
simpleXMLElement
<?php // declare data $data = [ 'Taro'=>['age'=>30, 'hobby'=>['Guitar','Piano']], 'Takeshi'=>['age'=>18, 'hobby'=>['Reading']], 'Arisa'=>['age'=>16, 'hobby'=>['Walking','Tea']], 'Sara'=>['age'=>22, 'hobby'=>['Sleeping']] ]; // saving file pass $file = "serialize-test.xml"; // transfer function from php array to XML function array2xml($arr, $xml_obj = NULL) { if ($xml_obj == NULL){ $def = '<?xml version="1.0"?><root></root>'; $xml_obj = new SimpleXMLElement($def); } foreach($arr as $key => $value){ if (is_numeric($key)) $key = "item"; if (is_array($value)){ $subnode = $xml_obj->addChile($key); array2xml($value, $subnode); } else { $v = htmlentities($value); $xml_obj->addChild($key, $v); } } return $xml_obj; } // transfer array to object $xml_obj = array2xml($data); $str = $xml_obj->asXML(); // save to file file_put_contents($file, $str); // read from file $xml2 = simplexml_load_file($file); foreach ($xml2->children() as $it){ $name = $it->getName(); $age = $it->age; echo "$name:$age:"; $hobby = $it->hobby; foreach ($hobby->children() as $h){ echo "($h)"; } echo "\n"; }
simple XML
phpでxmlを扱うにも、いろいろな方法があります。文字列のxmlを読み込んで解析し、xmlの内容を出力します。
<?php // set XML $xml_str = <<<XML <?xml version='1.0'?> <items> <item id="101"> <name>石鹸</name> <price>510</price> </item> <item id="102"> <name>ブラシ</name> <price>330</price> </item> </items> XML; // analyze XML $xml = simplexml_load_string($xml_str); // display each item info foreach ($xml->item as $it){ $attr = $it->attributes(); echo "(id:".$attr["id"].")"; echo $it->name." - ".$it->price." 円\n"; }
json_encode()
jsonを使って書き直し
<?php //declare data $data = [ 'Taro'=>['age'=>30, 'hobby'=>['Guitar','Piano']], 'Takeshi'=>['age'=>18, 'hobby'=>['Reading']], 'Arisa'=>['age'=>16, 'hobby'=>['Walking','Tea']], 'Sara'=>['age'=>22, 'hobby'=>['Sleeping']] ]; // file pass to preserve $file = "serialize-test.json"; //serialize $str = json_encode($data, JSON_PRENTY_PRINT); //preserve file_put_contents($file, $str); //recover data from a file $str2 = file_get_contents($file); $data2 = json_decode($str2, true); // display Arisa hobby print_r($data2['Arisa']['hobby']);
serialize()
phpの配列はメモリ上に配置されており、これをストレージに保存したり、ブラウザなどクライアント先に一定の書式で出力するためには、何らかのシリアライズ(serialize)という処理をする必要が有ります。
<?php // declare data $data = [ 'Taro'=>['age'=>30, 'hobby'=>['Guitar','Piano']], 'Takeshi'=>['age'=>18, 'hobby'=>['Reading']], 'Arisa'=>['age'=>16, 'hobby'=>['Walking','Tea']], 'Sara'=>['age'=>22, 'hobby'=>['Sleeping']] ]; $file = "serialize-test.txt"; $str = serialize($data); file_put_contents($file, $str); $str = serialize($data); file_put_contents($file, $str); $str2 = file_get_contents($file); $data2 = unserialize($str2); // display Arisa hobby print_r($data2['Arisa']['hobby']);
ビンゴマシン
<html><body><?php // bingo machine session_start(); // get from turn $turn = empty($_GET["turn"]) ? 0 : interval($_GET["turn"]); if($turn == 0|| empty($_SESSION["numbers"])){ $numbers = array(); for ($i = 1; $i <= 75; $i++){ $numbers[$i] = $i; } shuffle($numbers); // save session $_SESSION["numbers"] = $numbers; } $numbers = $_SESSION["numbers"]; $num = $numbers[$turn]; $now_turn = $turn + 1; $next = ($turn + 1) % 75; echo "<p>{$now_turn}ターン目</p>"; echo"<h1>$num</h1>"; echo "<p><a href='bingo.php?turn=$next'>next number</a></p>"; ?></body></html>
配列のデータをシャッフル
カードゲームやビンゴマシンを作る際には、配列のデータをシャッフルするアルゴリズムが重要
$sample_ary = array(1,2,3,4,5); shuffle($sample_ary); // display result foreach ($sample_ary as $v){ echo $v."\n"; }
フィッシャー・イェーツのシャッフル
<pre><?php // mt_rand() array shuffle function function mt_shuffle(&$a){ $a = array_values($a); for ($i = count($a) - 1; $i >= 1; $i--){ $r = mt_rand(0, $i); list($a[$i], $a[$r]) = array($a[$r], $a[$i]); } } // mt_shuffle() use example $sample_ary = array(1,2,3,4,5); mt_shuffle($sample_ary); foreach($sample_ary as $v){ echo $v."\n"; }
Mersenne Twister
<?php $MT_N = 624; $MT_M = 397; $MT_UPPER_MASK = 0x80000000; $MT_LOWER_MASK = 0x7fffffff; $mt = []; $mti = $MT_N + 1; // initialize function my_mt_srand($seed){ global $mt, $mti, $MT_N; $mt[0] = $seed & 0xfffffff; for ($mti = 1; $mti < $MT_N; $mti++){ $mt[$mti] = (1812433253 * ($mt[$mti-1] ^ ($mt[$mti-1] >> 30)) + $mti); $mt[$mti] &= 0xfffffff; } } function my_mt_rand($min, $max){ $range = $max - $min + 1; return (my_mt_genrand_int32() % $range) + $min; } function my_mt_genrand_int32() { global $MT_N, $MT_M, $mt, $mti; global $MT_UPPER_MASK, $MT_LOWER_MASK; static $mag01; $mag01 = array(0x0, 0x9908b0df); // table initialize if ($mti == $MT_N){ if ($mti == $MT_N + 1) my_mt_srand(time()); // remake table for ($kk = 0; $kk < $MT_N - $MT_M; $kk++){ $y = ($mt[$kk]&$MT_UPPER_MASK)|($mt[$kk+1]&$MT_LOWER_MASK); $mt[$kk] = $mt[$kk+($MT_M-$MT_N)] ^ ($y >> 1) ^ $mag01[$y & 0x1]; } $y = ($mt[$MT_N-1]&$MT_UPPER_MASK)|($mt[0]&$MT_LOWER_MASK); $mt[$MT_N-1] = $mt[$MT_M-1] ^ ($y >> 1) ^ $mag01[$y & 0x1]; $mti = 0; } $y = $mt[$mti++]; $y ^= ($y >> 11); $y ^= ($y << 7) & 0x9d2c5680; $y ^= ($y << 15) & 0xefc60000; $y ^= ($y >> 18); return $y; } my_mt_srand(time()); $list = array('●','▲','■','◯','△','□') for ($i = 0; $i < 256; $i++){ $c = $list[my_mt_rand(0, 5)]; echo $c; if($i % 16 == 15) echo "<br>"; }
linear congruential generators
<?php // rand initial number(seed) $lc_seed = 1; // random function fuction lc_rand() { global $lc_seed; $MASK = 0xffffffff; $lc_seed = (1103515245 * $lc_seed + 12345) & $MASK; return ($lc_seed / 65536) % 32768; } // initialize random function function lc_srand($seed) { global $lc_seed; $lc_seed = $seed; } // example lc_srand(time()); $list = array('●','▲','■','◯','△','□'); for ($i = 0; $i < 256; $i++){ $c = $list[lc_rand() % 6]; echo $c; if ($i % 16 == 15) echo "<br>"; }
パスワード生成ツール
<?php // random password program // character list for passwords $PASSWORD_CHARS = 'ABCDEFGHIJKLMNOPQRSTUVWXZ'. 'abcdefghijklmnopqrstuvwxz'. '0123456789_-#!$'; // make password and character list function password_gen($length){ global $PASSWORD_CHARS; $bytes = openssl_random_pseudo_bytes($length); $chars_len = strlen($PASSWORD_CHARS); $result = ""; for ($i = 0; $i < $length; $i++){ $r = ord(substr($bytes, $i, 1)) % $char_len; $result .= substr($PASSWROD_CHARS, $r, 1); } result $result; } $res = ""; $len = intval(empty($_GET["len"]) ? 12 : $_GET["len"]); if ($len == 0) $len = 12; for ($i = 1; $i <= 30; $i++){ $res .= password_gen($len)."\n"; } ?> <html><body bgcolor="#f0f0f0"> <form> 文字数:<input name="len" value="12"> <input type="submit" value="生成"> </form> パスワード候補:<br> <textarea rows="20" cols="20"><?php echo $res ?></textarea> </body></html>