【问题标题】:How would I loop through this?我将如何循环这个?
【发布时间】:2011-12-22 05:41:18
【问题描述】:

我有一个大数组。

在这个数组中,我有(除其他外)一个产品列表:

$data['product_name_0'] = '';
$data['product_desc_0'] = '';
$data['product_name_1'] = '';
$data['product_desc_1'] = '';

这个数组是由第三方提供的(所以我无法控制)。

不知道数组中会有多少产品。

循环所有产品的干净方法是什么?

我不想使用foreach 循环,因为它还会遍历(大)数组中的所有其他项。

我不能使用for 循环,因为我不知道(还)数组包含多少产品。

我可以做一个while循环:

$i = 0;
while(true) { // doing this feels wrong, although it WILL end at some time (if there are no other products)
    if (!array_key_exists('product_name_'.$i, $data)) {
        break;
    }

    // do stuff with the current product

    $i++;
}

有没有更清洁的方法来完成上述操作?

while(true) 在我看来很愚蠢,或者这种方法没有任何问题。

或者也许还有其他方法?

【问题讨论】:

    标签: php loops


    【解决方案1】:

    这个怎么样

    $i = 0;
    while(array_key_exists('product_name_'.$i, $data)) {
        // loop body
        $i++;
    }
    

    【讨论】:

      【解决方案2】:

      我认为你很接近。只需将测试置于 while 条件下即可。

      $i = 0;
      while(array_key_exists('product_name_'.$i, $data)) { 
          // do stuff with the current product
      
          $i++;
      }
      

      您也可以考虑:

      $i = 0;
      while(isset($data['product_name_'.$i])) { 
          // do stuff with the current product
      
          $i++;
      }
      

      issetarray_key_exists 稍微快一点,但表现稍有不同,因此可能适合您,也可能不适合您:

      What's quicker and better to determine if an array key exists in PHP?

      Difference between isset and array_key_exists

      【讨论】:

      • isset() 的行为与array_key_exists() 不同的事实是我没有使用它的原因:) 谢谢
      【解决方案3】:

      只要保证数字部分是连续的,您的方法就可以工作。如果有间隙,它将错过第一个间隙之后的任何内容。

      你可以使用类似的东西:

      $names = preg_grep('/^product_name_\d+$/', array_keys($data));
      

      这将从您的数组中返回所有“名称”键。您可以从键名中提取数字部分,然后也可以使用它来引用“desc”部分。

      foreach($names as $name_field) {
         $id = substr($names, 12);
         $name_val = $data["product_name_{$id}"];
         $desc_val = $data["product_desc_{$id}"];
      }
      

      【讨论】:

      • 这个解决方案是最干净的 imo,不知道为什么当 foreach 完成这项工作时会选择 while 循环控制。
      • 不错。我喜欢这个。问题虽然。在速度方面,preg_grep 的表现如何?它本质上是循环遍历整个集合以运行正则表达式,然后再次循环匹配吗?不过,如果不能保证您有连续的项目,这是赢家。
      • 它会解析一次数组并返回任何匹配项。然后 foreach 仅在这些匹配项上循环。因此,如果您有 50 个 $data 条目,您将获得 25 个“名称”匹配项,并且 foreach 将迭代 25 次。 Speedwise,它可能比进行简单的 substr 比较来查看数组键是否以 product_name_ 开头要慢,但 preg 版本将允许检查更复杂的键模式。
      猜你喜欢
      • 2020-06-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-28
      • 2022-11-19
      相关资源
      最近更新 更多