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)
每次操作都是常量。 strlen
是 O(1)
Algorithmic complexity of PHP function strlen()
大多数"performance-fastest"
既然你说数组可以很长,如果你不是立即生成数组,而是需要将项目推入其中,那么在你的推入操作中,你可以在推入之前检查 item_to_be_pushed
与 strlen
或您尝试比较的任何 属性 相同(可以任意选择,因为数组必须统一一些 property
)
在这种情况下,您可以有一些 object
和 property
: 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
-干杯
假设我有一个数组,比如:
$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)
每次操作都是常量。 strlen
是 O(1)
Algorithmic complexity of PHP function strlen()
大多数"performance-fastest"
既然你说数组可以很长,如果你不是立即生成数组,而是需要将项目推入其中,那么在你的推入操作中,你可以在推入之前检查 item_to_be_pushed
与 strlen
或您尝试比较的任何 属性 相同(可以任意选择,因为数组必须统一一些 property
)
在这种情况下,您可以有一些 object
和 property
: 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
-干杯