【问题标题】:PHP: return length of each array Element or stopPHP:返回每个数组元素的长度或停止
【发布时间】:2015-12-02 13:21:12
【问题描述】:

假设我有一个数组,说:

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

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

但万一我有类似的东西

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

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

在提高性能和速度方面最有效的方法是什么?由于这样的数组可能会变长。

【问题讨论】:

  • 这很简单,贴出您尝试过的代码并突出显示给您带来麻烦的原因。
  • 你试过了吗?

标签: php arrays cost-based-optimizer


【解决方案1】:

休闲方式

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

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

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

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()

大多数“性能最快”

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

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

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

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

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

【讨论】:

    【解决方案2】:

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

    例如

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

    【讨论】:

      【解决方案3】:

      只有我的两分钱。您也可以为此使用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

      -干杯

      【讨论】:

        猜你喜欢
        • 2013-12-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-26
        • 2014-07-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多