首先,我们回顾一下max()函数的基本用法。它可以接收一个数组或一组单独的数值作为参数,返回其中的最大值。例如:
<span><span><span class="hljs-variable">$values</span></span><span> = [</span><span><span class="hljs-number">10</span></span><span>, </span><span><span class="hljs-number">20</span></span><span>, </span><span><span class="hljs-number">30</span></span><span>, </span><span><span class="hljs-number">40</span></span><span>, </span><span><span class="hljs-number">50</span></span><span>];
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-title function_ invoke__">max</span></span><span>(</span><span><span class="hljs-variable">$values</span></span><span>); </span><span><span class="hljs-comment">// 输出 50</span></span><span>
</span></span>
这个函数也支持多个参数传递,每个参数会被当作一个单独的值进行比较。例如:
<span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-title function_ invoke__">max</span></span><span>(</span><span><span class="hljs-number">10</span></span><span>, </span><span><span class="hljs-number">20</span></span><span>, </span><span><span class="hljs-number">30</span></span><span>, </span><span><span class="hljs-number">40</span></span><span>, </span><span><span class="hljs-number">50</span></span><span>); </span><span><span class="hljs-comment">// 输出 50</span></span><span>
</span></span>
对于简单的数组结构来说,max()函数使用起来非常直接。但当数组变得更复杂,特别是多维数组时,情况就会有所不同。
在多维数组中,max()函数默认只能处理最外层的数组元素。如果我们希望在多维数组内部找到最大值,则需要借助一些额外的处理方法。以下是几种常见的技巧。
假设我们有一个多维数组,数组的每个子数组都包含了一些数字。如果我们想要获取每个子数组中的最大值,可以先通过array_map()函数将每个子数组应用max(),然后再使用max()找到最大的值。示例如下:
<span><span><span class="hljs-variable">$array</span></span><span> = [
[</span><span><span class="hljs-number">1</span></span><span>, </span><span><span class="hljs-number">2</span></span><span>, </span><span><span class="hljs-number">3</span></span><span>],
[</span><span><span class="hljs-number">4</span></span><span>, </span><span><span class="hljs-number">5</span></span><span>, </span><span><span class="hljs-number">6</span></span><span>],
[</span><span><span class="hljs-number">7</span></span><span>, </span><span><span class="hljs-number">8</span></span><span>, </span><span><span class="hljs-number">9</span></span><span>]
];
</span><span><span class="hljs-comment">// 获取每个子数组的最大值</span></span><span>
</span><span><span class="hljs-variable">$max_values</span></span><span> = </span><span><span class="hljs-title function_ invoke__">array_map</span></span><span>(</span><span><span class="hljs-string">'max'</span></span><span>, </span><span><span class="hljs-variable">$array</span></span><span>);
</span><span><span class="hljs-comment">// 输出每个子数组的最大值</span></span><span>
</span><span><span class="hljs-title function_ invoke__">print_r</span></span><span>(</span><span><span class="hljs-variable">$max_values</span></span><span>); </span><span><span class="hljs-comment">// 输出 [3, 6, 9]</span></span><span>
</span><span><span class="hljs-comment">// 获取最大值</span></span><span>
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-title function_ invoke__">max</span></span><span>(</span><span><span class="hljs-variable">$max_values</span></span><span>); </span><span><span class="hljs-comment">// 输出 9</span></span><span>
</span></span>
在这个例子中,array_map('max', $array)会应用max()函数到每个子数组上,得到每个子数组中的最大值。然后,再用max()函数获取这些最大值中的最大值。
有时候,多维数组中的数据是关联数组,每个子数组中有一个特定的键(如“score”),我们只想在某个特定键的值中找到最大值。在这种情况下,array_column()非常有用。它可以提取多维数组中所有子数组的某个指定列,然后与max()函数结合使用。示例如下:
<span><span><span class="hljs-variable">$array</span></span><span> = [
[</span><span><span class="hljs-string">'name'</span></span><span> => </span><span><span class="hljs-string">'Alice'</span></span><span>, </span><span><span class="hljs-string">'score'</span></span><span> => </span><span><span class="hljs-number">85</span></span><span>],
[</span><span><span class="hljs-string">'name'</span></span><span> => </span><span><span class="hljs-string">'Bob'</span></span><span>, </span><span><span class="hljs-string">'score'</span></span><span> => </span><span><span class="hljs-number">90</span></span><span>],
[</span><span><span class="hljs-string">'name'</span></span><span> => </span><span><span class="hljs-string">'Charlie'</span></span><span>, </span><span><span class="hljs-string">'score'</span></span><span> => </span><span><span class="hljs-number">92</span></span><span>]
];
</span><span><span class="hljs-comment">// 提取所有学生的score值</span></span><span>
</span><span><span class="hljs-variable">$scores</span></span><span> = </span><span><span class="hljs-title function_ invoke__">array_column</span></span><span>(</span><span><span class="hljs-variable">$array</span></span><span>, </span><span><span class="hljs-string">'score'</span></span><span>);
</span><span><span class="hljs-comment">// 输出所有学生的分数</span></span><span>
</span><span><span class="hljs-title function_ invoke__">print_r</span></span><span>(</span><span><span class="hljs-variable">$scores</span></span><span>); </span><span><span class="hljs-comment">// 输出 [85, 90, 92]</span></span><span>
</span><span><span class="hljs-comment">// 获取最大分数</span></span><span>
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-title function_ invoke__">max</span></span><span>(</span><span><span class="hljs-variable">$scores</span></span><span>); </span><span><span class="hljs-comment">// 输出 92</span></span><span>
</span></span>
在这个例子中,array_column($array, 'score')提取了所有学生的分数,然后用max()函数找到最大分数。
如果数组的嵌套层次更深,我们可以使用递归的方法来处理。递归函数可以用来遍历多维数组并找到最大值。以下是一个递归方法的示例:
<span><span><span class="hljs-function"><span class="hljs-keyword">function</span></span></span><span> </span><span><span class="hljs-title">getMaxValue</span></span><span>(</span><span><span class="hljs-params"><span class="hljs-variable">$array</span></span></span><span>) {
</span><span><span class="hljs-variable">$max</span></span><span> = PHP_INT_MIN; </span><span><span class="hljs-comment">// 设置一个初始值</span></span><span>
</span><span><span class="hljs-keyword">foreach</span></span><span> (</span><span><span class="hljs-variable">$array</span></span><span> </span><span><span class="hljs-keyword">as</span></span><span> </span><span><span class="hljs-variable">$value</span></span><span>) {
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-title function_ invoke__">is_array</span></span><span>(</span><span><span class="hljs-variable">$value</span></span><span>)) {
</span><span><span class="hljs-comment">// 如果值是一个数组,则递归调用</span></span><span>
</span><span><span class="hljs-variable">$max</span></span><span> = </span><span><span class="hljs-title function_ invoke__">max</span></span><span>(</span><span><span class="hljs-variable">$max</span></span><span>, </span><span><span class="hljs-title function_ invoke__">getMaxValue</span></span><span>(</span><span><span class="hljs-variable">$value</span></span><span>));
} </span><span><span class="hljs-keyword">else</span></span><span> {
</span><span><span class="hljs-comment">// 否则直接与当前最大值比较</span></span><span>
</span><span><span class="hljs-variable">$max</span></span><span> = </span><span><span class="hljs-title function_ invoke__">max</span></span><span>(</span><span><span class="hljs-variable">$max</span></span><span>, </span><span><span class="hljs-variable">$value</span></span><span>);
}
}
</span><span><span class="hljs-keyword">return</span></span><span> </span><span><span class="hljs-variable">$max</span></span><span>;
}
</span><span><span class="hljs-variable">$array</span></span><span> = [
[</span><span><span class="hljs-number">1</span></span><span>, </span><span><span class="hljs-number">2</span></span><span>, [</span><span><span class="hljs-number">3</span></span><span>, </span><span><span class="hljs-number">4</span></span><span>]],
[</span><span><span class="hljs-number">5</span></span><span>, </span><span><span class="hljs-number">6</span></span><span>, [</span><span><span class="hljs-number">7</span></span><span>, </span><span><span class="hljs-number">8</span></span><span>]],
</span><span><span class="hljs-number">9</span></span><span>
];
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-title function_ invoke__">getMaxValue</span></span><span>(</span><span><span class="hljs-variable">$array</span></span><span>); </span><span><span class="hljs-comment">// 输出 9</span></span><span>
</span></span>
此方法通过递归遍历数组的每一层,如果当前值是数组,则进入下一层继续比较;如果是数值,则与当前最大值进行比较。最终返回整个多维数组中的最大值。