Más contenido relacionado La actualidad más candente (20) Similar a PHP基本的関数QUIZ (14) Más de Wataru Terada (11) PHP基本的関数QUIZ9. 変数が
null , false , 0 , 0.0 , '' , [] , 未定義
なら true になる。
他にもあるが何?
empty(変数)
1:15+15
15. この結果は違う?
配列の + と array_merge は何が違う?
<?php
$a = ['a' => 1, 'b' => 3, 5];
$b = ['a' => 2, 'c' => 4, 6];
var_export($a + $b);
var_export(array_merge($a, $b));
2:15+30
16. 【$a + $b】
array (
'a' => 1, //先勝ち
'b' => 3,
'c' => 4,
0 => 5,
//先勝ちで6無し
)
→ key/index どちら
でも常に先勝ち
【array_merge($a, $b)】
array (
'a' => 2, //後勝ち
'b' => 3,
'c' => 4,
0 => 5,
1 => 6, //勝手に連番
)
→ key なら後勝ち
index なら連番
$a = ['a' => 1, 'b' => 3, 5];
$b = ['a' => 2, 'c' => 4, 6];
2:45+30
18. 【$a + $b】
array (
0 => 1,
1 => 2,
2 => 5,
)
【array_merge($a, $b)】
array(
0 => 1,
1 => 2,
2 => 3,
3 => 4,
4 => 5,
)
$a = [1,2];
$b = [3,4,5];
※おそらく混乱するので
配列の + はオススメしません。3:30+15
20. 下記ではどうなる?
$a = ['a' => ['b' => 1]];
$b = ['a' => ['c' => 2]];
var_export(array_merge_recursive($a, $b));
//[
// 'a' => [
// 'b' => 1,
// 'c' => 2,
// ]
//]
$a = ['a' => 1];
$b = ['a' => 1];
var_export(array_merge_recursive($a, $b));
3:45+30
21. $a = ['a' => 1];
$b = ['a' => 1];
var_export(array_merge_recursive($a, $b));
答え: ['a' => [1, 1]]
array_merge_recursive は再帰的にマージするものだが、
マージする対象に配列以外があった場合は、
配列に変換 してマージする。
配列への変換を望まないなら CakePHP なら Hash::merge が使える。
4:15+30
27. array (
0 => 'aaa',
1 => 'bbb',
2 => 'ccc',
)
<?php
$str = "aaa<br/>bbb<br>ccc";
$res = preg_split('/<br¥/?>/', $str);
var_export($res);
結果:
5:10+05
29. <?php
$str = "aaa<br/>bbb<br>ccc";
$res = preg_split('/(<br¥/?>)/', $str,
null, PREG_SPLIT_DELIM_CAPTURE);
var_export($res);
array (
0 => 'aaa',
1 => '<br/>',
2 => 'bbb',
3 => '<br>',
4 => 'ccc',
)
結果:
5:25+05
33. array_map
array_walk
array array_map ( callable $callback , array $array1 [, array $..
bool array_walk ( array &$array , callable $callback [, mixed $u
そう!
array_map は変更後の新しい配列を作るためのもの
array_walk は自身を書き換えるためのもの
6:15+30
35. $array1 = [1,2];
foreach ($array1 as &$val) {
$val = '書換';
}
$array2 = [3,4];
foreach ($array2 as $val) {
//何か
}
var_export($array1); // ['書換', 4] なぜ!?
var_export($array2); // [3, 4]
6:45+30
37. $array1 = [1,2];
foreach ($array1 as &$val) {
$val = ‘書換’;
}
unset($val); //かならずこれが必要
$array2 = [3,4];
foreach ($array2 as $val) {
//何か
}
7:15+15
40. これは何がNGか解りますか?
$fh = fopen($path, 'r');
while (($data = fgetcsv($fh, 1000, ",")) !== false) {
array_walk($data, function(&$val) {
$val = mb_convert_encoding($val,'UTF-8','SJIS');
});
// $data を使う処理
}
fclose($fh);
7:45+30
41. ならOK? まだダメですよね?
$fh = fopen($path, 'r');
while (($line = fgets($fh)) !== false) {
$line = mb_convert_encoding($line,'UTF-8','SJIS');
$data = str_getcsv($line, ",");
// $data を使う処理
}
fclose($fh);
エンコード前に fgetcsv を呼んではいけません。
区切り文字等の認識がエンコード前では正しくできないからです。
ならば
8:15+20
43. そこでストリームフィルタです!
$fh = fopen($path, 'r');
stream_filter_append($fh, 'convert.iconv.utf-16le/utf-8',
STREAM_FILTER_READ);
while (($data = fgetcsv($fh, 1000, ",")) !== false) {
// $data を使う処理
}
fclose($fh);
stream_filter_append($fh, 'convert.iconv.cp932/utf-8',
Shift_JIS を読む場合はこう:
8:45+30
55. Iterator (例)
class OreOreArrayIterator implements Iterator {
private $array;
private $i;
public function __construct($array) {
$this->array = $array;
$this->i = 0;
}
public function rewind() { $this->i = 0; }
public function next() { $this->i++; }
public function valid() { return ($this->i < count($this->array)); }
public function key() { return $this->i; }
public function current() { return $this->array[$this->i]; }
}
foreach (new OreOreArrayIterator([1,2,3]) as $a) {
echo $a;
}
//123
13:30+60