「PHP/入門/関数とは」の版間の差分

削除された内容 追加された内容
Ef3 (トーク | 投稿記録)
→‎コードキャラリー: まとまった規模で、実用的な目的に叶うコードを読まないと機能の存在理由などの言語設計に思い至りにくいので、コードの断片から少し踏み込んだプログラムを掲載します。 →‎array_*関数の拡張: PHPの組込み関数には、array_reduce(),array_map() のように array_ はじまる配列関数群があります。 これらは便利なのですが、配列とハッシュ兼用でJavaScriptやRubyなどから来ると面食らうことがあります。 また、配列の添字がcallback関数にわたらない仕様も移植のときに問題になります。 そこで、上記の問題をクリアした配列専用の関数群を作ってみました。 また、sum() は、カハンの加算アルゴリズムを使い誤差を最小にするようにしています。
タグ: 2017年版ソースエディター
Ef3 (トーク | 投稿記録)
→‎array_*関数の拡張: 結果を説明的に
タグ: 2017年版ソースエディター
477 行
declare(strict_types=1);
 
$a1 = [2, 3, 5, 7, 11];
function reduce(array $ary, callable $code): mixed {
$result = 0;
491 ⟶ 490行目:
return $result;
}
echo 'reduce([1, 2, 3], fn($s, $x) => $s + $x) --> ', reduce([1, 2, 3], fn($s, $x) => $s + $x), PHP_EOL;
echo 'reduce(["A", "B", "C"], fn($s, $x) => $s . $x) --> ', reduce(["A", "B", "C"], fn($s, $x) => $s . $x), PHP_EOL;
echo PHP_EOL;
 
503 ⟶ 502行目:
return $result;
}
$a1 = [2, 3, 5, 7, 11];
echo implode(",", map($a1, fn($x) => $x * $x)), PHP_EOL;
echo '$a1 = [2, 3, 5, 7, 11];', PHP_EOL;
echo 'implode(",", map($a1, fn($x) => $x * $x)) --> ', implode(",", map($a1, fn($x) => $x * $x)), PHP_EOL;
echo PHP_EOL;
 
512 ⟶ 513行目:
}
}
echo 'each($a1, fn($x, $i) => printf("%d[%d]\n ", $x, $i)); --> ';
each($a1, fn($x, $i) => printf("%d[%d] ", $x, $i));
echo PHP_EOL;
echo PHP_EOL;
 
function filter(array $ary, callable $code): array {
524 ⟶ 528行目:
return $result;
}
echo 'implode(",", filter($a1, fn($x) => $x % 2)) --> ', implode(",", filter($a1, fn($x) => $x % 2)), PHP_EOL;
echo 'implode(",", filter($a1, fn($x) => $x < 6)) --> ', implode(",", filter($a1, fn($x) => $x < 6)), PHP_EOL;
echo PHP_EOL;
 
function sum(array $ary): int|float|null {
$sum = null;
$i = 0;
foreach ($ary as $delta) {
544 ⟶ 550行目:
}
$nums = array_fill(0, 10, 0.1);
echo sprintf("%.53f", reduce('$nums, fn= array_fill($x0, $y)10, => $x + $y)0.1);', PHP_EOL;
echo 'reduce($nums, fn($x, $y) => $x + $y) --> ', sprintf("%.53f", array_sumreduce($nums, fn($x, $y) => $x + $y)), PHP_EOL;
echo 'array_sum($nums) --> ', sprintf("%.53f", sumarray_sum($nums)), PHP_EOL;
echo 'sum($nums) --> ', sprintf("%d.53f", sum(range(1, 100)$nums)), PHP_EOL;
echo 'sum(range(1, 100)) --> ', sprintf("%d", sum(range(1, 100))), PHP_EOL;
echo 'sum([]) --> ';
var_dump(sum([]));
echo PHP_EOL;
 
554 ⟶ 563行目:
foreach ($ary as $el) {
if (!$code($el, $i++)) {
return 0 != 0false;
}
}
return 0 == 0true;
}
echo 'every($a1, fn($x) => $x != 1) --> ';
var_dump(every($a1, fn($x) => $x != 1));
echo 'every($a1, fn($x) => $x == 2) --> ';
var_dump(every($a1, fn($x) => $x == 2));
echo PHP_EOL;
567 ⟶ 578行目:
foreach ($ary as $el) {
if ($code($el, $i++)) {
return 0 == 0true;
}
}
return 0 != 0false;
}
echo 'some($a1, fn($x) => $x != 1) --> ';
var_dump(some($a1, fn($x) => $x != 1));
echo 'some($a1, fn($x) => $x == 2) --> ';
var_dump(some($a1, fn($x) => $x == 2));
echo PHP_EOL;
579 ⟶ 592行目:
</syntaxhighlight>
;実行結果:<syntaxhighlight lang=text>
reduce([1, 2, 3], fn($s, $x) => $s + $x) --> 6
6
reduce(["A", "B", "C"], fn($s, $x) => $s . $x) --> ABC
ABC
 
$a1 = [2, 3, 5, 7, 11];
4,9,25,49,121
echo implode(",", map($a1, fn($x) => $x * $x)), PHP_EOL;--> 4,9,25,49,121
 
each($a1, fn($x, $i) => printf("%d[%d] ", $x, $i)); --> 2[0] 3[1] 5[2] 7[3] 11[4]
2[0]
3[1]
5[2]
7[3]
11[4]
3,5,7,11
 
implode(",", filter($a1, fn($x) => $x % 2)) --> 3,5,7,11
0.99999999999999988897769753748434595763683319091796875
implode(",", filter($a1, fn($x) => $x < 6)) --> 2,3,5
0.99999999999999988897769753748434595763683319091796875
1.00000000000000000000000000000000000000000000000000000
5050
 
$nums = array_fill(0, 10, 0.1);
bool(true)
reduce($nums, fn($x, $y) => $x + $y) --> 0.99999999999999988897769753748434595763683319091796875
bool(false)
array_sum($nums) --> 0.99999999999999988897769753748434595763683319091796875
sum($nums) --> 1.00000000000000000000000000000000000000000000000000000
sum(range(1, 100)) --> 5050
sum([]) --> NULL
 
every($a1, fn($x) => $x != 1) --> bool(true)
every($a1, fn($x) => $x == 2) --> bool(false)
bool(true)
 
some($a1, fn($x) => $x != 1) --> bool(true)
some($a1, fn($x) => $x == 2) --> bool(true)
</syntaxhighlight>