「PHP/入門/関数とは」の版間の差分
削除された内容 追加された内容
→コードキャラリー: まとまった規模で、実用的な目的に叶うコードを読まないと機能の存在理由などの言語設計に思い至りにくいので、コードの断片から少し踏み込んだプログラムを掲載します。 →array_*関数の拡張: PHPの組込み関数には、array_reduce(),array_map() のように array_ はじまる配列関数群があります。 これらは便利なのですが、配列とハッシュ兼用でJavaScriptやRubyなどから来ると面食らうことがあります。 また、配列の添字がcallback関数にわたらない仕様も移植のときに問題になります。 そこで、上記の問題をクリアした配列専用の関数群を作ってみました。 また、sum() は、カハンの加算アルゴリズムを使い誤差を最小にするようにしています。 タグ: 2017年版ソースエディター |
→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]
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
echo 'reduce($nums, fn($x, $y) => $x + $y) --> ', sprintf("%.53f",
echo 'array_sum($nums) --> ', sprintf("%.53f",
echo 'sum($nums) --> ', sprintf("%
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
}
}
return
}
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
}
}
return
}
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
reduce(["A", "B", "C"], fn($s, $x) => $s . $x) --> ABC
$a1 = [2, 3, 5, 7, 11];
each($a1, fn($x, $i) => printf("%d[%d] ", $x, $i)); --> 2[0] 3[1] 5[2] 7[3] 11[4]
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▼
$nums = array_fill(0, 10, 0.1);
▲reduce($nums, fn($x, $y) => $x + $y) --> 0.99999999999999988897769753748434595763683319091796875
▲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)
some($a1, fn($x) => $x != 1) --> bool(true)
some($a1, fn($x) => $x == 2) --> bool(true)
</syntaxhighlight>
|