金钗宝藏 發表於 2026-5-3 17:23:44

分享一些实用的PHP函数(对比js/ts实现,附代码)

<div id="navCategory"><h5 class="catalogue">目录</h5><ul class="first_class_ul"><li><a href="#_label0">检查数组所有元素是否满足给定条件</a></li><ul class="second_class_ul"><li><a href="#_lab2_0_0">思路</a></li><li><a href="#_lab2_0_1">代码实现</a></li><ul class="third_class_ul"><li><a href="#_label3_0_1_0">php代码实现</a></li><li><a href="#_label3_0_1_1">使用示例</a></li><li><a href="#_label3_0_1_2">js代码实现</a></li><li><a href="#_label3_0_1_3">ts代码实现</a></li><li><a href="#_label3_0_1_4">使用示例</a></li></ul><li><a href="#_lab2_0_2">总结</a></li><ul class="third_class_ul"></ul></ul><li><a href="#_label1">检查数组所有元素是否有一项满足给定条件</a></li><ul class="second_class_ul"><li><a href="#_lab2_1_3">实现思路</a></li><ul class="third_class_ul"></ul><li><a href="#_lab2_1_4">代码实现</a></li><ul class="third_class_ul"><li><a href="#_label3_1_4_5">php代码实现</a></li><li><a href="#_label3_1_4_6">使用示例</a></li><li><a href="#_label3_1_4_7">js代码实现</a></li><li><a href="#_label3_1_4_8">ts代码实现</a></li><li><a href="#_label3_1_4_9">使用示例</a></li></ul><li><a href="#_lab2_1_5">总结</a></li><ul class="third_class_ul"></ul></ul><li><a href="#_label2">检查 2 个数字是否大致相等</a></li><ul class="second_class_ul"><li><a href="#_lab2_2_6">实现思路</a></li><ul class="third_class_ul"></ul><li><a href="#_lab2_2_7">代码实现</a></li><ul class="third_class_ul"><li><a href="#_label3_2_7_10">php代码实现</a></li><li><a href="#_label3_2_7_11">使用示例</a></li><li><a href="#_label3_2_7_12">js代码实现</a></li><li><a href="#_label3_2_7_13">ts代码实现</a></li><li><a href="#_label3_2_7_14">使用示例</a></li></ul><li><a href="#_lab2_2_8">总结</a></li><ul class="third_class_ul"></ul></ul><li><a href="#_label3">平均值</a></li><ul class="second_class_ul"><li><a href="#_lab2_3_9">实现思路</a></li><ul class="third_class_ul"></ul><li><a href="#_lab2_3_10">代码实现</a></li><ul class="third_class_ul"><li><a href="#_label3_3_10_15">php代码实现</a></li><li><a href="#_label3_3_10_16">使用示例</a></li><li><a href="#_label3_3_10_17">js代码实现</a></li><li><a href="#_label3_3_10_18">ts代码实现</a></li><li><a href="#_label3_3_10_19">使用示例</a></li></ul><li><a href="#_lab2_3_11">总结</a></li><ul class="third_class_ul"></ul></ul><li><a href="#_label4">数值限定</a></li><ul class="second_class_ul"><li><a href="#_lab2_4_12">实现思路</a></li><ul class="third_class_ul"></ul><li><a href="#_lab2_4_13">代码实现</a></li><ul class="third_class_ul"><li><a href="#_label3_4_13_20">php代码实现</a></li><li><a href="#_label3_4_13_21">使用示例</a></li><li><a href="#_label3_4_13_22">js代码实现</a></li><li><a href="#_label3_4_13_23">ts代码实现</a></li><li><a href="#_label3_4_13_24">使用示例</a></li></ul><li><a href="#_lab2_4_14">总结</a></li><ul class="third_class_ul"></ul></ul><li><a href="#_label5">组合函数</a></li><ul class="second_class_ul"><li><a href="#_lab2_5_15">实现思路</a></li><ul class="third_class_ul"></ul><li><a href="#_lab2_5_16">代码实现</a></li><ul class="third_class_ul"><li><a href="#_label3_5_16_25">php代码实现</a></li><li><a href="#_label3_5_16_26">使用示例</a></li><li><a href="#_label3_5_16_27">js代码实现</a></li><li><a href="#_label3_5_16_28">ts代码实现</a></li><li><a href="#_label3_5_16_29">使用示例</a></li></ul><li><a href="#_lab2_5_17">总结</a></li><ul class="third_class_ul"></ul></ul><li><a href="#_label6">统计字符串中元音字母的数量</a></li><ul class="second_class_ul"><li><a href="#_lab2_6_18">实现思路</a></li><ul class="third_class_ul"></ul><li><a href="#_lab2_6_19">代码实现</a></li><ul class="third_class_ul"><li><a href="#_label3_6_19_30">php代码实现</a></li><li><a href="#_label3_6_19_31">使用示例</a></li><li><a href="#_label3_6_19_32">js代码实现</a></li><li><a href="#_label3_6_19_33">ts代码实现</a></li><li><a href="#_label3_6_19_34">使用示例</a></li></ul><li><a href="#_lab2_6_20">总结</a></li><ul class="third_class_ul"></ul></ul><li><a href="#_label7">柯里化函数</a></li><ul class="second_class_ul"><li><a href="#_lab2_7_21">实现思路</a></li><ul class="third_class_ul"></ul><li><a href="#_lab2_7_22">代码实现</a></li><ul class="third_class_ul"><li><a href="#_label3_7_22_35">php代码实现</a></li><li><a href="#_label3_7_22_36">使用示例</a></li><li><a href="#_label3_7_22_37">js代码实现</a></li><li><a href="#_label3_7_22_38">ts代码实现</a></li><li><a href="#_label3_7_22_39">使用示例</a></li></ul><li><a href="#_lab2_7_23">总结</a></li><ul class="third_class_ul"></ul></ul><li><a href="#_label8">取消字符串首字母大写</a></li><ul class="second_class_ul"><li><a href="#_lab2_8_24">实现思路</a></li><ul class="third_class_ul"></ul><li><a href="#_lab2_8_25">代码实现</a></li><ul class="third_class_ul"><li><a href="#_label3_8_25_40">php代码实现</a></li><li><a href="#_label3_8_25_41">使用示例</a></li><li><a href="#_label3_8_25_42">js代码实现</a></li><li><a href="#_label3_8_25_43">ts代码实现</a></li><li><a href="#_label3_8_25_44">使用示例</a></li></ul><li><a href="#_lab2_8_26">总结</a></li><ul class="third_class_ul"></ul></ul><li><a href="#_label9">深度展开数组</a></li><ul class="second_class_ul"><li><a href="#_lab2_9_27">实现思路</a></li><ul class="third_class_ul"></ul><li><a href="#_lab2_9_28">代码实现</a></li><ul class="third_class_ul"><li><a href="#_label3_9_28_45">php代码实现</a></li><li><a href="#_label3_9_28_46">使用示例</a></li><li><a href="#_label3_9_28_47">js代码实现</a></li><li><a href="#_label3_9_28_48">ts代码实现</a></li><li><a href="#_label3_9_28_49">使用示例</a></li></ul></ul><li><a href="#_label10">总结</a></li><ul class="second_class_ul"></ul></ul></div><p class="maodian"><a name="_label0"></a></p><h2>检查数组所有元素是否满足给定条件</h2>
<p>如果提供的函数对数组的所有元素返回&nbsp;<code>true</code>,则返回&nbsp;<code>true</code>,否则返回&nbsp;<code>false</code>。</p>
<p class="maodian"><a name="_lab2_0_0"></a></p><h3>思路</h3>
<p>实现思路如下:</p>
<p>使用数组的<code>filter</code>方法对数组执行给定的函数,然后使用<code>count</code>方法获取执行后的结果,再和<code>count</code>方法获取未执行<code>filter</code>方法的结果进行比较。</p>
<p class="maodian"><a name="_lab2_0_1"></a></p><p class="maodian"><a name="_lab2_1_4"></a></p><p class="maodian"><a name="_lab2_2_7"></a></p><p class="maodian"><a name="_lab2_3_10"></a></p><p class="maodian"><a name="_lab2_4_13"></a></p><p class="maodian"><a name="_lab2_5_16"></a></p><p class="maodian"><a name="_lab2_6_19"></a></p><p class="maodian"><a name="_lab2_7_22"></a></p><p class="maodian"><a name="_lab2_8_25"></a></p><p class="maodian"><a name="_lab2_9_28"></a></p><h3>代码实现</h3>
<p>下面我们来看php和js以及ts代码的实现:</p>
<p class="maodian"><a name="_label3_0_1_0"></a></p><p class="maodian"><a name="_label3_1_4_5"></a></p><p class="maodian"><a name="_label3_2_7_10"></a></p><p class="maodian"><a name="_label3_3_10_15"></a></p><p class="maodian"><a name="_label3_4_13_20"></a></p><p class="maodian"><a name="_label3_5_16_25"></a></p><p class="maodian"><a name="_label3_6_19_30"></a></p><p class="maodian"><a name="_label3_7_22_35"></a></p><p class="maodian"><a name="_label3_8_25_40"></a></p><p class="maodian"><a name="_label3_9_28_45"></a></p><h4>php代码实现</h4>
<div class="jb51code"><pre class="brush:php;">function all($arr,$fn){
    return count(array_filter($arr,$fn)) === count($arr);
}</pre></div>
<p class="maodian"><a name="_label3_0_1_1"></a></p><p class="maodian"><a name="_label3_0_1_4"></a></p><p class="maodian"><a name="_label3_1_4_6"></a></p><p class="maodian"><a name="_label3_1_4_9"></a></p><p class="maodian"><a name="_label3_2_7_11"></a></p><p class="maodian"><a name="_label3_2_7_14"></a></p><p class="maodian"><a name="_label3_3_10_16"></a></p><p class="maodian"><a name="_label3_3_10_19"></a></p><p class="maodian"><a name="_label3_4_13_21"></a></p><p class="maodian"><a name="_label3_4_13_24"></a></p><p class="maodian"><a name="_label3_5_16_26"></a></p><p class="maodian"><a name="_label3_5_16_29"></a></p><p class="maodian"><a name="_label3_6_19_31"></a></p><p class="maodian"><a name="_label3_6_19_34"></a></p><p class="maodian"><a name="_label3_7_22_36"></a></p><p class="maodian"><a name="_label3_7_22_39"></a></p><p class="maodian"><a name="_label3_8_25_41"></a></p><p class="maodian"><a name="_label3_8_25_44"></a></p><p class="maodian"><a name="_label3_9_28_46"></a></p><p class="maodian"><a name="_label3_9_28_49"></a></p><h4>使用示例</h4>
<div class="jb51code"><pre class="brush:php;">all(, function ($item) {
return $item &gt; 1;
}); // true</pre></div>
<p class="maodian"><a name="_label3_0_1_2"></a></p><p class="maodian"><a name="_label3_1_4_7"></a></p><p class="maodian"><a name="_label3_2_7_12"></a></p><p class="maodian"><a name="_label3_3_10_17"></a></p><p class="maodian"><a name="_label3_4_13_22"></a></p><p class="maodian"><a name="_label3_5_16_27"></a></p><p class="maodian"><a name="_label3_6_19_32"></a></p><p class="maodian"><a name="_label3_7_22_37"></a></p><p class="maodian"><a name="_label3_8_25_42"></a></p><p class="maodian"><a name="_label3_9_28_47"></a></p><h4>js代码实现</h4>
<div class="jb51code"><pre class="brush:js;">const all = (arr,fn) =&gt; arr.filter(fn).length === arr.length;</pre></div>
<p class="maodian"><a name="_label3_0_1_3"></a></p><p class="maodian"><a name="_label3_1_4_8"></a></p><p class="maodian"><a name="_label3_2_7_13"></a></p><p class="maodian"><a name="_label3_3_10_18"></a></p><p class="maodian"><a name="_label3_4_13_23"></a></p><p class="maodian"><a name="_label3_5_16_28"></a></p><p class="maodian"><a name="_label3_6_19_33"></a></p><p class="maodian"><a name="_label3_7_22_38"></a></p><p class="maodian"><a name="_label3_8_25_43"></a></p><p class="maodian"><a name="_label3_9_28_48"></a></p><h4>ts代码实现</h4>
<div class="jb51code"><pre class="brush:js;">const all = &lt;T,U&gt;(arr:T[], fn: (value: T, index: number, array: T[]) =&gt; U) =&gt; arr.filter(fn).length === arr.length;</pre></div>
<h4>使用示例</h4>
<div class="jb51code"><pre class="brush:php;">all(,n =&gt; n &gt; 1); // true</pre></div>
<p class="maodian"><a name="_lab2_0_2"></a></p><p class="maodian"><a name="_lab2_1_5"></a></p><p class="maodian"><a name="_lab2_2_8"></a></p><p class="maodian"><a name="_lab2_3_11"></a></p><p class="maodian"><a name="_lab2_4_14"></a></p><p class="maodian"><a name="_lab2_5_17"></a></p><p class="maodian"><a name="_lab2_6_20"></a></p><p class="maodian"><a name="_lab2_7_23"></a></p><p class="maodian"><a name="_lab2_8_26"></a></p><h3>总结</h3>
<p>与js/ts实现不同点如下:</p>
<ol><li>php通过<code>count</code>方法来获取数组的长度,而js/ts则可以直接通过<code>length</code>来获取数组的长度。</li><li>php的<code>filter</code>方法名叫<code>array_filter</code>,而js/ts则是叫<code>filter</code>。</li></ol>
<p class="maodian"><a name="_label1"></a></p><h2>检查数组所有元素是否有一项满足给定条件</h2>
<p>如果提供的函数对数组的至少一个元素返回&nbsp;<code>true</code>,则返回&nbsp;<code>true</code>,否则返回&nbsp;<code>false</code>。</p>
<p class="maodian"><a name="_lab2_1_3"></a></p><p class="maodian"><a name="_lab2_2_6"></a></p><p class="maodian"><a name="_lab2_3_9"></a></p><p class="maodian"><a name="_lab2_4_12"></a></p><p class="maodian"><a name="_lab2_5_15"></a></p><p class="maodian"><a name="_lab2_6_18"></a></p><p class="maodian"><a name="_lab2_7_21"></a></p><p class="maodian"><a name="_lab2_8_24"></a></p><p class="maodian"><a name="_lab2_9_27"></a></p><h3>实现思路</h3>
<p>实现思路和前面的<code>all</code>函数很相似,只不过这里不需要做比较,只需要判断长度大于0即可。</p>
<h3>代码实现</h3>
<p>下面我们来看php和js以及ts代码的实现:</p>
<h4>php代码实现</h4>
<div class="jb51code"><pre class="brush:php;">function any($arr,$fn){
    return count(array_filter($arr,$fn)) &gt; 0;
}</pre></div>
<h4>使用示例</h4>
<div class="jb51code"><pre class="brush:php;">any(, function ($item) {
return $item &lt; 3;
}); // true</pre></div>
<h4>js代码实现</h4>
<div class="jb51code"><pre class="brush:js;">const any = (arr,fn) =&gt; arr.filter(fn).length &gt; 0;</pre></div>
<h4>ts代码实现</h4>
<div class="jb51code"><pre class="brush:js;">const any = &lt;T,U&gt;(arr:T[], fn: (value: T, index: number, array: T[]) =&gt; U) =&gt; arr.filter(fn).length &gt; 0;</pre></div>
<h4>使用示例</h4>
<div class="jb51code"><pre class="brush:php;">any(,n =&gt; n &lt; 3); // true</pre></div>
<h3>总结</h3>
<p>与all的总结一致。</p>
<p class="maodian"><a name="_label2"></a></p><h2>检查 2 个数字是否大致相等</h2>
<p>检查两个数字是否大致相等。</p>
<h3>实现思路</h3>
<p>实现思路如下:</p>
<p>该函数有3个参数,通过<code>abs</code>方法计算前面2个参数的绝对差值,然后与第三个参数进行比较,判断是否小于第三个参数,第三个参数默认值是0.001。</p>
<h3>代码实现</h3>
<p>下面我们来看php和js以及ts代码的实现:</p>
<h4>php代码实现</h4>
<div class="jb51code"><pre class="brush:php;">function apprEqual($a,$b,$c = 0.001){
    return abs($a - $b) &lt; $c;
}</pre></div>
<h4>使用示例</h4>
<div class="jb51code"><pre class="brush:php;">apprEqual(10.0, 10.00001); // true
apprEqual(10.0, 10.01); // false</pre></div>
<h4>js代码实现</h4>
<div class="jb51code"><pre class="brush:js;">const apprEqual = (a,b,c = 0.001) =&gt; Math.abs(a - b) &lt; c;</pre></div>
<h4>ts代码实现</h4>
<div class="jb51code"><pre class="brush:js;">const apprEqual = (a: number,b:number,c = 0.001) =&gt; Math.abs(a - b) &lt; c;</pre></div>
<h4>使用示例</h4>
<div class="jb51code"><pre class="brush:php;">apprEqual(10.0, 10.00001); // true
apprEqual(10.0, 10.01); // false</pre></div>
<h3>总结</h3>
<p>与js/ts实现不同点如下:</p>
<ol><li>php的获取绝对值的方法名叫<code>abs</code>,而js/ts则是从<code>Math</code>对象中获取,即<code>Math.abs</code>。</li></ol>
<p class="maodian"><a name="_label3"></a></p><h2>平均值</h2>
<p>返回两个或多个数字的平均值。</p>
<h3>实现思路</h3>
<p>实现思路如下:</p>
<p>使用<code>sum</code>函数求和,然后除以长度<code>count</code>即可,参数可以使用展开运算符来组成一个数组,注意需要写一个三元表达式,判断长度是否为0。</p>
<h3>代码实现</h3>
<p>下面我们来看php和js以及ts代码的实现:</p>
<h4>php代码实现</h4>
<div class="jb51code"><pre class="brush:php;">function average(...$arr){
    $len = count($arr);
    return $len === 0 ? 0 : array_sum($arr) / $len;
}</pre></div>
<h4>使用示例</h4>
<div class="jb51code"><pre class="brush:php;">average(1, 2, 3); // 2</pre></div>
<h4>js代码实现</h4>
<div class="jb51code"><pre class="brush:js;">const average = (...arr) =&gt; {
    const len = arr.length;
    return len === 0 ? 0 : arr.reduce((r,i) =&gt; r += i,0) / len;
}</pre></div>
<h4>ts代码实现</h4>
<div class="jb51code"><pre class="brush:js;">const average = (...arr: number[]):number =&gt; {
    const len = arr.length;
    return len === 0 ? 0 : arr.reduce((r,i) =&gt; r += i,0) / len;
}</pre></div>
<h4>使用示例</h4>
<div class="jb51code"><pre class="brush:php;">average(1, 2, 3); // 2</pre></div>
<h3>总结</h3>
<p>与js/ts实现不同点如下:</p>
<ol><li>php可以直接使用<code>array_sum</code>方法求数字数组的和,js/ts需要循环自己计算(或者自己实现一个<code>sum</code>方法)。</li></ol>
<p class="maodian"><a name="_label4"></a></p><h2>数值限定</h2>
<p>将数值限制在边界值&nbsp;<code>a</code>&nbsp;和&nbsp;<code>b</code>&nbsp;指定的包含范围内。</p>
<h3>实现思路</h3>
<p>实现思路如下:</p>
<p>如果该数值在范围内,则返回该数值,否则,使用最小值方法和最大值方法返回范围内最接近的数字。</p>
<h3>代码实现</h3>
<p>下面我们来看php和js以及ts代码的实现:</p>
<h4>php代码实现</h4>
<div class="jb51code"><pre class="brush:php;">function clampNumber($num,$a,$b){
    return max(min($num,max($a,$b)),min($a,$b));
}</pre></div>
<h4>使用示例</h4>
<div class="jb51code"><pre class="brush:php;">clampNumber(2, 3, 5); // 3
clampNumber(1, -1, -5); // -1</pre></div>
<h4>js代码实现</h4>
<div class="jb51code"><pre class="brush:js;">const clampNumber = (num,a,b) =&gt; {
    const max = Math.max,min = Math.min;
    return max(min(num,max(a,b)),min(a,b));
}</pre></div>
<h4>ts代码实现</h4>
<div class="jb51code"><pre class="brush:js;">const clampNumber = (num:number,a:number,b:number) =&gt; {
    const max = Math.max,min = Math.min;
    return max(min(num,max(a,b)),min(a,b));
}</pre></div>
<h4>使用示例</h4>
<div class="jb51code"><pre class="brush:js;">clampNumber(2, 3, 5); // 3
clampNumber(1, -1, -5); // -1</pre></div>
<h3>总结</h3>
<p>与js/ts实现不同点如下:</p>
<ol><li>php的获取最小值和最大值的方法名叫<code>min</code>和<code>max</code>,而js/ts则是从<code>Math</code>对象中获取,即<code>Math.min</code>和<code>Math.max</code>。</li></ol>
<p class="maodian"><a name="_label5"></a></p><h2>组合函数</h2>
<p>返回一个将多个函数组合成单个可调用函数的新函数。</p>
<h3>实现思路</h3>
<p>实现思路如下:</p>
<p>使用&nbsp;<code>array_reduce()</code>&nbsp;执行从右到左的函数组合。该函数接收3个参数,第一个参数为函数列表,第二个参数是一个回调函数用来合并数组中的每一个函数,第三个参数是函数的初始值,即<code>$function($x){ return $x; }</code>,默认是一个恒等函数,也就是一个返回其输入参数本身的函数。</p>
<h3>代码实现</h3>
<p>下面我们来看php和js以及ts代码的实现:</p>
<h4>php代码实现</h4>
<div class="jb51code"><pre class="brush:php;">function compose(...$fns){
    return array_reduce(
      $fns,
      function ($carry,$fn){
            // 使用 use语句导入闭包中的变量$carry,$fn
            return function($x) use ($carry,$fn){
                return $carry($fn($x));
            }
      },
      $function($x){
            return $x;
      }
    )
}</pre></div>
<h4>使用示例</h4>
<div class="jb51code"><pre class="brush:php;">$compose = compose(
// 加2
function ($x) {
    return $x + 2;
},
// 乘以4
function ($x) {
    return $x * 4;
}
);
$compose(3); // 20</pre></div>
<h4>js代码实现</h4>
<div class="jb51code"><pre class="brush:js;">const compose = (...fns) =&gt; fns.reduce((f,h) =&gt; (...args) =&gt; f(h(...args)));</pre></div>
<h4>ts代码实现</h4>
<div class="jb51code"><pre class="brush:js;">type ComposeFn&lt;T extends any&gt; = (...args: T[]) =&gt; T;

const compose = &lt;T,U extends ComposeFn&lt;T&gt;[]&gt;(...fns: U) =&gt;
    fns.reduce(
      (f, h) =&gt;
            (...args: Parameters&lt;ComposeFn&lt;T&gt;&gt;) =&gt; f(h(...args))
    );
</pre></div>
<h4>使用示例</h4>
<div class="jb51code"><pre class="brush:js;">const add5 = x =&gt; x + 5;
const multiply = (x, y) =&gt; x * y;
const multiplyAndAdd5 = compose(add5, multiply);
const res = multiplyAndAdd5(5, 2); // 15</pre></div>
<h3>总结</h3>
<p>与js/ts实现不同点如下:</p>
<ol><li>php需要使用<code>use</code>语句来导入闭包中的变量,而js/ts则不需要。</li><li>php使用<code>array_reduce</code>方法来遍历函数数组,并且需要提供一个恒等函数作为第三个参数的初始值,而js/ts直接调用数组的<code>reduce</code>方法来遍历函数数组,并且不需要提供第三个作为初始值的参数。</li></ol>
<p class="maodian"><a name="_label6"></a></p><h2>统计字符串中元音字母的数量</h2>
<p>返回所提供字符串中的元音字母数量。</p>
<h3>实现思路</h3>
<p>实现思路如下:</p>
<p>使用正则表达式来匹配元音字母,元音字母包含a、e、i、o、u等字母。调用php的<code>preg_match_all</code>方法来匹配,然后使用<code>count</code>方法计算返回值的长度,即为元音字母的数量。</p>
<h3>代码实现</h3>
<p>下面我们来看php和js以及ts代码的实现:</p>
<h4>php代码实现</h4>
<div class="jb51code"><pre class="brush:php;">function countVowels($str){
    preg_match_all('//i',$str,$matches);
    // $matches为匹配结果
    return count($matches);
}</pre></div>
<h4>使用示例</h4>
<div class="jb51code"><pre class="brush:php;">countVowels('sampleInput'); // 4</pre></div>
<h4>js代码实现</h4>
<div class="jb51code"><pre class="brush:js;">const countVowels = (str) =&gt; [...str.matchAll(//ig)].length;</pre></div>
<h4>ts代码实现</h4>
<div class="jb51code"><pre class="brush:js;">const countVowels = (str: string) =&gt; [...str.matchAll(//ig)].length;</pre></div>
<h4>使用示例</h4>
<div class="jb51code"><pre class="brush:php;">countVowels('sampleInput'); // 4</pre></div>
<h3>总结</h3>
<p>与js/ts实现不同点如下:</p>
<ol><li>php使用<code>preg_match_all</code>方法来匹配字符串所有符合条件的字符,而js/ts则使用<code>String.matchAll</code>方法。</li><li>php 定义正则表达式和js/ts有所区别,需要把正则表达式当作一个字符串。</li><li>js/ts调用<code>matchAll</code>方法时需要提供一个g修饰符,表示用来匹配全局,php则不需要。</li><li>js/ts调用<code>matchAll</code>方法返回的是一个迭代器,需要使用展开运算符转换成数组,然后再计算长度。</li><li>php使用<code>count</code>方法来获取数组的长度,而js/ts可以直接通过<code>length</code>属性来获取。</li></ol>
<p class="maodian"><a name="_label7"></a></p><h2>柯里化函数</h2>
<p>对函数进行柯里化,以便在多次调用中获取参数。</p>
<h3>实现思路</h3>
<p>实现思路如下:</p>
<ol><li><code>curry</code>接收一个函数参数,返回执行的累积器<code>$acc</code>。</li><li>使用<code>&amp;</code>操作符引用累积器,使用<code>use</code>语句导入函数和累积器。</li><li>使用<code>array_merge</code>方法合并所有参数。</li><li>使用php反射<code>ReflectionFunction</code>获取函数所需参数数量,然后调用<code>getNumberOfRequiredParameters</code>方法获取必需参数的数量。</li><li>如果必需参数数量小于等于外部参数数量,则直接返回函数执行参数结果,否则递归的执行累积器。</li></ol>
<h3>代码实现</h3>
<p>下面我们来看php和js以及ts代码的实现:</p>
<h4>php代码实现</h4>
<div class="jb51code"><pre class="brush:php;">function curry($fn){
    $acc = function ($arg) use ($fn,&amp;$acc){
      return function (...$args) use($fn,$arg,$acc){
            // 合并参数
            $arg = array_merge($args);
            // 创建一个反射
            $ref = new ReflectionFunction($fn);
            // 通过反射获取必需参数
            $totalArgs = $ref -&gt; getNumberOfRequiredParameters();
            
            if($totalArgs &lt;= count($arg)){
                return $fn(...$arg);
            }
            
            return $acc($arg);
      }
    }
   
    return $acc([]);
}</pre></div>
<h4>使用示例</h4>
<div class="jb51code"><pre class="brush:php;">$curriedAdd = curry(function ($a, $b) { return $a + $b; });
$add10 = $curriedAdd(10);
var_dump($add10(15)); // 25</pre></div>
<h4>js代码实现</h4>
<div class="jb51code"><pre class="brush:js;">const curry = fn =&gt; (...args) =&gt; args.length &gt;= fn.length ? fn(...args) : (...nArgs) =&gt; curry(fn)(...args,...nArgs);</pre></div>
<h4>ts代码实现</h4>
<div class="jb51code"><pre class="brush:js;">const curry =
&lt;T, R, F extends (...args: T[]) =&gt; R&gt;(fn: F) =&gt;
(...args: T[]) =&gt;
    args.length &gt;= fn.length
      ? fn(...args)
      : (...nArgs: T[]) =&gt; curry(fn as (...args: unknown[]) =&gt; unknown)(...args, ...nArgs);</pre></div>
<h4>使用示例</h4>
<div class="jb51code"><pre class="brush:php;">const curriedAdd = curry((a,b) =&gt; a + b);
const add10 = curriedAdd(10);
const res = add10(15); // 25</pre></div>
<h3>总结</h3>
<p>与js/ts实现不同点如下:</p>
<ol><li>php中使用了反射相关方法来获取参数,而js/ts则不需要。</li><li>php使用<code>array_merge</code>方法来合并参数,而js/ts则不需要。</li><li>两者的判断逻辑也有差异。</li></ol>
<p>ps: 两者的实现都采用了递归的方式,这点需要注意。</p>
<p class="maodian"><a name="_label8"></a></p><h2>取消字符串首字母大写</h2>
<p>取消字符串首字母的大写。</p>
<h3>实现思路</h3>
<p>实现思路如下:</p>
<p>调用<code>lcfirst</code>方法可以直接将字符串大写首字母转换成小写,根据第二个参数<code>$upperRest</code>来决定是否将其余字母转换成大写,使用<code>strtoupper</code>方法即可。</p>
<h3>代码实现</h3>
<p>下面我们来看php和js以及ts代码的实现:</p>
<h4>php代码实现</h4>
<div class="jb51code"><pre class="brush:php;">function decapitalize($str,$upperRest = false){
    return lcfirst($upperRest ? strtoupper($str) : $str);
}</pre></div>
<h4>使用示例</h4>
<div class="jb51code"><pre class="brush:php;">decapitalize('FooBar'); // 'fooBar'</pre></div>
<h4>js代码实现</h4>
<div class="jb51code"><pre class="brush:js;">const decapitalize = (str, upperRest = false) =&gt; str.slice(0,1).toLowerCase() + `${upperRest ? str.slice(1).toUpperCase() : str.slice(1)}`;</pre></div>
<h4>ts代码实现</h4>
<div class="jb51code"><pre class="brush:js;">const decapitalize = (str: string, upperRest = false) =&gt; str.slice(0,1).toLowerCase() + `${upperRest ? str.slice(1).toUpperCase() : str.slice(1)}`;</pre></div>
<h4>使用示例</h4>
<div class="jb51code"><pre class="brush:php;">decapitalize('FooBar'); // 'fooBar'</pre></div>
<h3>总结</h3>
<p>与js/ts实现不同点如下:</p>
<ol><li>php有方法可以直接将首字母转换成小写,而js/ts则需要通过<code>slice</code>(或其它字符串的截取方法,例如:<code>substr</code>)方法来截取字符串,然后拼接在一起。</li><li>php转换成大写的方法是<code>strtoupper</code>,而js/ts则是通过调用<code>String.toUpperCase</code>方法来转换成大写。</li></ol>
<p class="maodian"><a name="_label9"></a></p><h2>深度展开数组</h2>
<p>深度展平数组,直接将多维数组转成一维数组。</p>
<h3>实现思路</h3>
<p>实现思路如下:</p>
<p>使用<code>foreach</code>循环数组,如果数组项是数组(使用<code>is_array</code>方法来判断),则使用递归加<code>array_push</code>和空数组以及展开运算符来合并数组,否则直接使用<code>[]</code>语法来添加数组项(相当于<code>array_push</code>方法)。</p>
<h3>代码实现</h3>
<p>下面我们来看php和js以及ts代码的实现:</p>
<h4>php代码实现</h4>
<div class="jb51code"><pre class="brush:php;">function deepFlatten($items){
    $res = [];
    foreach($item as $items){
      if(is_array($item)){
            array_push($res,...deepFlatten($item));
      }else{
            $res[] = $item;
      }
    }
    return $res;
}</pre></div>
<h4>使用示例</h4>
<div class="jb51code"><pre class="brush:php;">deepFlatten(, [, 4], 5]); // </pre></div>
<h4>js代码实现</h4>
<div class="jb51code"><pre class="brush:js;">const deepFlatten = (items) =&gt; {
let res = [];
for(const item of items){
    if(Array.isArray(item) &amp;&amp; item.length &gt; 0){
      res.push(...deepFlatten(item))
    }else{
      res.push(item)
    }
}
return res;
}</pre></div>
<h4>ts代码实现</h4>
<div class="jb51code"><pre class="brush:js;">const deepFlatten = &lt;T&gt;(items: T[]) =&gt; {
let res: T[] = [];
for (const item of items) {
    if (Array.isArray(item) &amp;&amp; item.length &gt; 0) {
      res.push(...deepFlatten(item));
    } else {
      res.push(item);
    }
}
return res;
};</pre></div>
<h4>使用示例</h4>
<div class="jb51code"><pre class="brush:php;">deepFlatten(, [, 4], 5]); // </pre></div>
<p class="maodian"><a name="_label10"></a></p><h2>总结</h2>
<p>与js/ts实现不同点如下:</p>
<ol><li>php使用<code>array_push</code>方法来往数组末尾添加元素,而js/ts则是直接使用<code>push</code>方法。</li><li>php可以使用<code>[]</code>语法来代替<code>array_push</code>方法,js/ts没有相关语法。</li><li>php使用<code>is_array</code>方法来判断是否是数组,而js/ts则使用<code>Array.isArray</code>方法。</li><li>php使用<code>foreach</code>循环遍历数组,js/ts没有<code>foreach</code>循环,但可以使用<code>for</code>循环代替。</li></ol>
頁: [1]
查看完整版本: 分享一些实用的PHP函数(对比js/ts实现,附代码)