PHP:返回每个数组元素或停止的长度

Con*_*nce 2 php arrays cost-based-optimizer

鉴于我有一个数组,说:

$myArray=['12','AB','3C']
Run Code Online (Sandbox Code Playgroud)

我想返回值2(这是每个数组元素的长度.)

但万一我有类似的东西

$myArray=['12','AB2','3C']
Run Code Online (Sandbox Code Playgroud)

我想在数组的第二个元素之后立即停止计算/循环'AB2',让我的函数返回null.

在性能和速度有效的问题上达成此目标的最有效方法是什么?因为这样的阵列可以变长.

q.T*_*hen 5

随便的方式

我想你在元素中得到两个不同长度的那一刻就试图阻止数组循环?

在这种情况下,在最坏的情况下,你需要一个O(n)运行时(因为你需要验证每个元素,除非你有一个抽象的数据类型,在这种情况下它可能是O(1),如果它存储在object属性或你计算将项目推入数组时即时检测到的差异)

由于我们发现一个元素的长度不同,我们可以简单地快速存储数组中第一个元素的长度,因为我们知道如果我们检测到除了我们存储的以外的任何其他长度,我们可以立即返回 null

function linear_loop($array) {
    $len_of_first = strlen($array[0]);
    foreach ($array as $val) {
        if (strlen($val) != $len_of_first) {
            return null;
        }
    }
    //Function still running, entire array was same, return the length of first element
    return $len_of_first;
}
Run Code Online (Sandbox Code Playgroud)

这个功能是O(n)每个操作都是不变的.strlenO(1)

PHP函数strlen()的算法复杂性

最"性能最快"

既然你说数组可能会很长,如果你没有立即生成数组,而是你需要将项目推入其中,那么在你的推送操作中,你可以在推送它之前检查它item_to_be_pushed是相同的strlen或任何属性你试图比较你存储的那个(可以随意挑选,因为数组必须是统一的一些property)

在这种情况下,您可以object使用property:uniform_length并存储它.然后,无论何时push进入阵列,都可以使用uniform_length.如果长度不同,则可以将对象属性存储uniform为false.(默认情况下uniform为true,因为如果数组中只有一个元素,则它必须是一致的).

这将是一个O(1)计算,因为它存储为属性.但是你可能不需要像这样简单的对象,你可以将它存储为一些变量.

O(1)vs O(n)运行时以及为什么它更具性能效果

既然不是每个人都知道Big O,那就快速解释一下我说的话.O(1)运行时比O(n)运行时"无限"更好,因为函数的运行时不会随输入增长(因为处理100万个项目需要与处理1个项目相同的步骤量)