优化的关键在于。如果我们只是为了得到最大值,并不需要完整的映射结果,就可以将逻辑写在一次循环中完成:
<span><span><span class="hljs-variable">$prices</span></span><span> = [</span><span><span class="hljs-number">1999</span></span><span>, </span><span><span class="hljs-number">2500</span></span><span>, </span><span><span class="hljs-number">3200</span></span><span>, </span><span><span class="hljs-number">1800</span></span><span>];
</span><span><span class="hljs-variable">$maxPrice</span></span><span> = </span><span><span class="hljs-literal">null</span></span><span>;
</span><span><span class="hljs-keyword">foreach</span></span><span> (</span><span><span class="hljs-variable">$prices</span></span><span> </span><span><span class="hljs-keyword">as</span></span><span> </span><span><span class="hljs-variable">$p</span></span><span>) {
</span><span><span class="hljs-variable">$converted</span></span><span> = </span><span><span class="hljs-variable">$p</span></span><span> / </span><span><span class="hljs-number">100</span></span><span>;
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$maxPrice</span></span><span> === </span><span><span class="hljs-literal">null</span></span><span> || </span><span><span class="hljs-variable">$converted</span></span><span> > </span><span><span class="hljs-variable">$maxPrice</span></span><span>) {
</span><span><span class="hljs-variable">$maxPrice</span></span><span> = </span><span><span class="hljs-variable">$converted</span></span><span>;
}
}
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-variable">$maxPrice</span></span><span>; </span><span><span class="hljs-comment">// 输出 32</span></span><span>
</span></span>
这样做避免了array_map创建新数组的过程,节省了内存,并且在大数据场景下性能会更好。
如果代码需要保留函数式风格,又想减少内存消耗,可以考虑生成器:
<span><span><span class="hljs-function"><span class="hljs-keyword">function</span></span></span><span> </span><span><span class="hljs-title">convertPrices</span></span><span>(</span><span><span class="hljs-params"><span class="hljs-variable">$prices</span></span></span><span>) {
</span><span><span class="hljs-keyword">foreach</span></span><span> (</span><span><span class="hljs-variable">$prices</span></span><span> </span><span><span class="hljs-keyword">as</span></span><span> </span><span><span class="hljs-variable">$p</span></span><span>) {
</span><span><span class="hljs-keyword">yield</span></span><span> </span><span><span class="hljs-variable">$p</span></span><span> / </span><span><span class="hljs-number">100</span></span><span>;
}
}
</span><span><span class="hljs-variable">$prices</span></span><span> = [</span><span><span class="hljs-number">1999</span></span><span>, </span><span><span class="hljs-number">2500</span></span><span>, </span><span><span class="hljs-number">3200</span></span><span>, </span><span><span class="hljs-number">1800</span></span><span>];
</span><span><span class="hljs-variable">$maxPrice</span></span><span> = </span><span><span class="hljs-title function_ invoke__">max</span></span><span>(</span><span><span class="hljs-title function_ invoke__">iterator_to_array</span></span><span>(</span><span><span class="hljs-title function_ invoke__">convertPrices</span></span><span>(</span><span><span class="hljs-variable">$prices</span></span><span>)));
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-variable">$maxPrice</span></span><span>; </span><span><span class="hljs-comment">// 输出 32</span></span><span>
</span></span>
虽然这里使用了iterator_to_array,但在更复杂的流式处理场景中,生成器可以避免大规模数据一次性加载进内存,具有更好的扩展性。
相关标签:
array_map