【问题标题】:How to skip the 1st key in an array loop?如何跳过数组循环中的第一个键?
【发布时间】:2010-09-27 03:48:53
【问题描述】:

我有以下代码:

if ($_POST['submit'] == "Next") {
    foreach($_POST['info'] as $key => $value) {
        echo $value;
    }
}

如何让 foreach 函数从数组中的第二个键开始?

【问题讨论】:

    标签: php arrays


    【解决方案1】:

    我网站上的工作代码,用于跳过第一个结果然后继续。

    <?php 
    
    $counter = 0;
    
    foreach ($categoriest as $category) { if ($counter++ == 0) continue; ?>
    

    它也在 tpl 文件中的 opencart 上工作,如果你需要,可以这样做。

    【讨论】:

      【解决方案2】:

      另一种方法是使用数组指针:

      reset($_POST['info']); //set pointer to zero
      while ($value=next($_POST['info'])  //ponter+1, return value
      {
        echo key($_POST['info']).":".$value."\n";
      }
      

      【讨论】:

        【解决方案3】:

        你不能取消设置数组吗...

        所以如果我有一个不想要第一个实例的数组, 我可以:

        unset($array[0]);
        

        这将从数组中删除实例。

        【讨论】:

        • 在这种情况下是的,但是如果你想在数组中的第二个值和第一个值之间做一些比较呢?
        【解决方案4】:

        这样的事情怎么样?使用 key()current() 读取第一个键和值,然后 array_shift() 从数组中取出前面的元素(编辑:不要使用 array_shift(),它会重新编号任何数字数组中的索引,您并不总是想要!)。

        "一个!!", '两个' => "两个!!", '三' => "树", 4 => "第四元素", 99 =>“我们在这里跳过了一些..” ) ; $firstKey = key($arr); $firstVal = 当前($arr); echo("

        OK,第一个值为 $firstKey, $firstVal

        "); ####array_shift($arr); #'dequeue' 前端元素 # 糟糕!重新编号! 未设置($arr[$firstKey]); # 更好的! echo("

        现在给其余的人

        "); foreach( $arr as $key=>$val ) { 回声(“

        $key => $val

        ”); } ?>

        【讨论】:

          【解决方案5】:

          如果您愿意丢弃第一个元素,可以使用array_shift()。然而,这在一个巨大的阵列上很慢。更快的操作将是

          reset($a);
          unset(key($a));
          

          【讨论】:

          • 真的吗? array_shift() 会变慢多少?为什么unset 会更快?
          • 你知道,我不记得我为什么回答这个问题了。很长一段时间都不需要这个技巧,但我可能会通过另一种方式一次加速!我想一个大小为几十 Mb 的数组可能会有所不同。
          • 真的!! array_shift() 是毒药!!它实际上重新编号所有数值数组索引——即使它们最初是稀疏的(例如,在 array_shift() 操作之后,定义的数组 array(1=&gt;'a', 3=&gt;'b', 99=&gt;'c') 将等同于 array('0'=&gt;'b', '1'=c)。不要@ 987654329@ 除非这是你想要的!!
          • 所以是的,这就是为什么它更快。重新索引操作需要很长时间。
          • 自己做研究做得很好。请注意,有时键无关紧要。
          【解决方案6】:

          在一个包含 1000 个元素的数组上,差异非常小。

          测试:

          <?php
          function slice($a)
          {
              foreach(array_slice($a, 1) as $key)
              {
          
              }
          
              return true;
          }
          
          function skip($a)
          {
              $first = false;
          
              foreach($a as $key)
              {
                  if($first)
                  {
                      $first = false;
                      continue;
                  }
              }
          
              return true;
          }
          
          $array = array_fill(0, 1000, 'test');
          
          $t1 = time() + microtime(true);
          
          for ($i = 0; $i < 1000; $i++)
          {
              slice($array);
          }
          
          var_dump((time() + microtime(true)) - $t1);
          
          echo '<hr />';
          
          $t2 = time() + microtime(true);
          
          for ($i = 0; $i < 1000; $i++)
          {
              skip($array);
          }
          
          var_dump((time() + microtime(true)) - $t2);
          ?>
          

          输出:

          浮点数(0.23605012893677)

          浮点数(0.24102783203125)

          【讨论】:

          • 我认为内存使用是这里更重要的区别——也许用 memory_get_usage() 来衡量
          • 11 年后,但是在你的跳过函数中,first 不应该以真实开头吗?
          【解决方案7】:

          如果你的表单结构不同

            <input type='text' name='quiz[first]' value=""/>
            <input type='text' name='quiz[second]' value=""/>
          

          ...然后在你的 PHP 中

          if( isset($_POST['quiz']) AND 
              is_array($_POST['quiz'])) {
          
              //...and we'll skip $_POST['quiz']['first'] 
              foreach($_POST['quiz'] as $key => $val){
                if($key == "first") continue;
                print $val; 
              }
          }
          

          ...您现在可以遍历该特定结构并正常访问rest

          【讨论】:

          • 用整数代替字符串怎么样? (尽管从技术上讲它是作为字符串发送的,但使用整数更容易调试(和生成!)。)
          【解决方案8】:

          如果您使用的是普通数组,我会说使用类似

          foreach (array_slice($ome_array, 1) as $k =&gt; $v {...

          但是,由于您正在查看用户请求,因此您对返回参数的顺序没有任何真正的保证 - 某些浏览器/代理可能会改变其行为,或者您可能只是决定修改您的将来形成。无论哪种方式,忽略数组的顺序并将 POST 值视为无序哈希映射对您来说都是最有利的,这给您留下了两个选择:

          • 复制数组和unset要忽略的键
          • 在看到您希望忽略的键时循环遍历整个数组和continue

          【讨论】:

          • 来自php.net/types.array:“PHP 中的数组实际上是一个有序映射”。他们的行为有点奇怪。
          【解决方案9】:
          foreach($_POST['info'] as $key=>$value) { if ($key == 0) { //or what ever the first key you're using is continue; } else { echo $value; } }

          【讨论】:

            【解决方案10】:

            对于相当小的数组,使用array_slice 创建第二个:

            foreach(array_slice($_POST['info'],1) as $key=>$value)
            {
                echo $value;
            }
            

            【讨论】:

            • array_slice 的出色运用精湛
            【解决方案11】:
            foreach(array_slice($_POST['info'], 1) as $key=>$value) {
                echo $value;
            }
            

            或者,如果您不想复制数组,您可以这样做:

            $isFirst = true;
            foreach($_POST['info'] as $key=>$value) {
                if ($isFirst) {
                    $isFirst = false;
                    continue;
                }   
                echo $value;
            }
            

            【讨论】:

            • 我更喜欢 isFirst 解决方案。在您的面部逻辑中,扫描不熟悉的代码时很容易错过数组切片版本。
            • isFirst 解决方案也可以更好地适应数组大小。
            【解决方案12】:

            在循环中:

            if ($key == 0) //or whatever
               continue;
            

            【讨论】:

            • 我倾向于建议不要在循环中测试“特殊情况”,如果它们是预先知道的(即第一个条目)-> -1
            • 我不知道@xtofl 的确切原因,但对我来说,问题是如果你在特殊情况下,每次循环运行时都必须测试
            猜你喜欢
            • 1970-01-01
            • 2014-01-08
            • 1970-01-01
            • 2018-06-17
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2017-11-11
            • 1970-01-01
            相关资源
            最近更新 更多