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

时间:2015-09-07 04:12:11

标签: php arrays cost-based-optimizer

鉴于我有一个数组,请说:

$sql = "SELECT * FROM albums WHERE path='" . $albumPath . "'";
$result = mysql_query($sql);
while($row = mysql_fetch_assoc($result)){
    $albumName = $row['name'];
    $views = $row['views'];
    $id = $row['id'];
}
$views = intval($views) + 1;
$sql = "UPDATE albums SET views='$views' WHERE id='" . $id . "'";
$result = mysql_query($sql);

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

但是如果我有类似

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

我想在数组$myArray=['12','AB2','3C'] 的第二个元素之后立即停止计算/循环,让我的函数返回null。

在性能和速度有效的问题上达成此目标的最有效方法是什么?因为这样的数组可能会变长。

3 个答案:

答案 0 :(得分:5)

休闲方式

我认为你试图在元素中获得两个不同长度的时候停止数组循环?

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

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

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; } ,每个操作都是常量。 O(n)strlen

Algorithmic complexity of PHP function strlen()

最“性能最快”

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

在这种情况下,您可以拥有一些strlen propertyobject并存储它。然后,只要您property进入数组,就可以使用uniform_length进行检查。如果长度不同,则可以将名为push的对象属性存储为false。 (默认情况下uniform_length为真,因为如果数组中只有一个元素,则它必须是统一的。

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

O(1)vs O(n)运行时及其性能更高的原因

因为不是每个人都知道Big O,所以对我所说的内容进行了快速解释。 uniform运行时比O(1)运行时“无限”更好,因为函数的运行时不会随输入增长(如处理100万项需要与处理1项相同的步骤数)

答案 1 :(得分:2)

当你发现一些不正确的东西时,只需循环并尽早返回。在您分析并发现此功能确实是您的瓶颈之前,不要担心微观优化

离。

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

答案 2 :(得分:0)

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

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

您只需撰写if语句并查看max($lengths)并返回true or false

-Cheers