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

PHP: return length of each array Element or stop

假设我有一个数组,比如:

$myArray=['12','AB','3C']

我想 return 值 2(这是每个数组元素的长度。)

但万一我有类似

$myArray=['12','AB2','3C']

我想在数组 'AB2' 的第二个元素 之后立即停止 calculation/loop 并让我的函数 return 为空。

在性能和速度方面达到此目的的最有效方法是什么?因为这样的数组可以变长。

只需循环并 return 当您发现不正确的内容时尽早。在分析并发现此功能确实是您的瓶颈之前,不要担心微优化

例如

function isCorrect($arr) {
   $len = strlen($arr[0]);
   for($arr as $val) {
      if(strlen($val) != $len) {
          return false;
      }
   }
   return true;
}

休闲方式

我认为当您在一个元素中获得两个不同的长度时,您正试图停止数组循环?

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

既然我们发现一个元素的长度不一样,我们可以简单地快速存储数组中第一个元素的长度,因为我们知道如果我们检测到任何其他长度而不是我们存储的长度,我们可以立即returnnull

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;
}

这个函数O(n)每次操作都是常量。 strlenO(1)

Algorithmic complexity of PHP function strlen()

大多数"performance-fastest"

既然你说数组可以很长,如果你不是立即生成数组,而是需要将项目推入其中,那么在你的推入操作中,你可以在推入之前检查 item_to_be_pushedstrlen 或您尝试比较的任何 属性 相同(可以任意选择,因为数组必须统一一些 property )

在这种情况下,您可以有一些 objectproperty: uniform_length 并存储它。然后每当你 push 进入你的数组时,你可以用 uniform_length 检查它。如果它的长度不一样,那么你可以在名为 uniform 的对象 属性 中存储为 false。 (默认情况下 uniform 为真,因为如果数组中只有一个元素,则它必须是统一的)。

这将是一个 O(1) 计算,因为它存储为一个属性。但是对于像这样简单的事情,您可能不需要对象,您可以将它存储为某个变量。

O(1) 与 O(n) 运行时间以及为什么它更有效

由于不是每个人都知道 Big O,所以快速解释一下我所说的内容。 O(1) 运行时 "infinitely" 优于 O(n) 运行时,因为函数的运行时不会随着输入而增长(因为处理 100 万个项目需要与处理 1 个项目相同的步骤)

只是我的两分钱。您也可以为此使用 array_map

$myArray = ['12','AB','3CC'];
$lengths = array_map('strlen', $myArray);
// output
Array
(
    [0] => 2
    [1] => 2
    [2] => 3
)

你可以只写一个 if 语句并检查 max($lengths) 和 return true or false

-干杯