【问题标题】:Get the first element of an array获取数组的第一个元素
【发布时间】:2010-12-27 15:27:35
【问题描述】:

我有一个数组:

array( 4 => 'apple', 7 => 'orange', 13 => 'plum' )

我想得到这个数组的第一个元素。预期结果:字符串 apple

一个要求:不能通过引用传递,所以array_shift不是一个好的解决方案。

我该怎么做?

【问题讨论】:

  • 什么意思,不能通过引用完成?
  • 函数不应该使用&$array作为参数。
  • 我怀疑你“真正”的意思是“不能通过引用来完成”,是你的数组是从数据库动态返回的,你不想传递数组在从中获取第一个元素之前放入变量中。如果我是对的,那么下面提供给您的所有解决方案中的绝大多数(包括接受的答案)都是不够的。
  • 你只需要得到它还是得到它并从现有数组中删除它?
  • 对于数组的基本使用,您可以查看此链接technofusions.com/introduction-to-arrays-in-php

标签: php arrays


【解决方案1】:

current($array)

返回数组的第一个元素according to the PHP manual

每个数组都有一个指向其“当前”元素的内部指针,该元素被初始化为插入数组的第一个元素。

所以它在你重新定位数组指针之前一直有效,否则你将不得不使用reset() 它将倒回数组并返回数组的第一个元素

According to the PHP manual reset.

reset() 将数组的内部指针倒回到第一个元素并返回第一个数组元素的值。

current()reset() 的示例

$array = array('step one', 'step two', 'step three', 'step four');

// by default, the pointer is on the first element
echo current($array) . "<br />\n"; // "step one"

//Forward the array pointer and then reset it

// skip two steps
next($array);
next($array);
echo current($array) . "<br />\n"; // "step three"

// reset pointer, start again on step one
echo reset($array) . "<br />\n"; // "step one"

【讨论】:

  • 我不知道为什么这不是公认的答案,因为它相当简单准确地回答了这个问题。
  • current($array) 仅在数组指针“当前”指向第一个元素时才有效,否则将需要 reset($array)
  • 似乎current() 不再需要引用,尽管 PHP 文档没有反映这一点。所以我认为这已经成为最好的解决方案了。
  • @Ryan 同意,但是这个解决方案是在 2014 年之前的 2 年在 this other answer of this same thread... 奇怪的是这个不完整的句子得到了更多的支持。
  • 如果数组为空怎么办? reset()current() 将返回 false,如果您希望数组包含 bool 值,这可能会导致错误。
【解决方案2】:
<?php
    $arr = array(3 => "Apple", 5 => "Ball", 11 => "Cat");
    echo array_values($arr)[0]; // Outputs: Apple
?>

其他例子:

<?php
    $arr = array(3 => "Apple", 5 => "Ball", 11 => "Cat");
    echo current($arr); // Outputs: Apple
    echo reset($arr); // Outputs: Apple
    echo next($arr); // Outputs: Ball
    echo current($arr); // Outputs: Ball
    echo reset($arr); // Outputs: Apple
?>

【讨论】:

    【解决方案3】:
    $arr = $array = array( 9 => 'apple', 7 => 'orange', 13 => 'plum' );
    echo reset($arr); // echoes 'apple'
    

    如果不想丢失当前指针位置,只需为数组创建别名即可。

    【讨论】:

    • 没听懂,什么意思?第一个的键是否大于其他的键都可以正常工作。
    • +1 仅供参考 reset() 已经返回第一个元素,因此无需使用 current() -- echo reset($arr) 就足够了
    • @Mike 但您可能更喜欢 currentreset 以避免在参考案例中产生 PHP 通知/错误,例如current(array_filter(...)); in 3v4l.
    • 如果数组为空怎么办? reset() 将返回 false,如果您希望数组包含 bool 值,这可能会导致错误。
    【解决方案4】:

    一行关闭、复制、重置:

    <?php
    
    $fruits = array(4 => 'apple', 7 => 'orange', 13 => 'plum');
    
    echo (function() use ($fruits) { return reset($fruits); })();
    

    输出:

    apple
    

    或者更短的短箭头函数:

    echo (fn() => reset($fruits))();
    

    这使用如上所述的按值变量绑定。两者都不会改变原始指针。

    【讨论】:

    • 注意 $copy = $fruits; echo reset($copy); 在 PHP 版本中更便携。
    • 如果你不关心原始指针。 reset($fruits) 会的!
    【解决方案5】:

    PHP 7.3 添加了两个函数,用于直接获取数组的第一个和最后一个键,而无需修改原始数组,也无需创建任何临时对象:

    “有几种方法可以为 PHP 7.3.0 之前的版本提供此功能。可以使用 array_keys(),但效率可能相当低。也可以使用 reset() 和 key() ,但是这样可能会改变内部数组指针。一个高效的解决方案,不改变内部数组指针,写成polyfill:"

    <?php
    if (!function_exists('array_key_first')) {
        function array_key_first($arr) {
            foreach($arr as $key => $unused) {
                return $key;
            }
            return NULL;
        }
    }
    
    if (!function_exists('array_key_last')) {
        function array_key_last($arr) {
            return array_key_first(array_reverse($arr, true));
        }
    }
    ?>
    

    【讨论】:

      【解决方案6】:

      保持简单!这里有很多正确的答案,但为了尽量减少所有的混淆,这两个工作并减少了很多开销:

      key($array) 获取数组的第一个键
      current($array) 获取数组的第一个值


      编辑:
      关于下面的cmets。以下示例将输出:string(13) "PHP code test"

      $array = array
      (
         '1'           => 'PHP code test',  
         'foo'         => 'bar', 5 , 5 => 89009, 
         'case'        => 'Random Stuff: '.rand(100,999),
         'PHP Version' => phpversion(),
         0             => 'ending text here'
      );
      
      var_dump(current($array));
      

      【讨论】:

      • 呃。 current 等于当前元素。您必须将指针重置为数组的开头,以确保它实际上位于开头。
      • current() 将获取当前元素,而不是第一个元素。不一样。
      • 如果数组中只有一个元素,current 将起作用。
      【解决方案7】:

      您可以使用以下编码获取第一个元素:

      $array_key_set = array_keys($array);
      $first_element = $array[$array_key_set[0]];
      

      或使用:

      $i=0;
      foreach($array as $arr)
      {
        if($i==0)
        {
          $first_element=$arr;
          break;
        }
       $i++;
      }
      echo $first_element;
      

      【讨论】:

      • 为什么不直接跳出循环呢? foreach ($array as $arr) { $first_element = $arr; break; }
      • $i if 语句完全不相关,您可以简单地将它们一起排除。 $i 在第一个循环中总是为 0,它总是在到达 $i++; 之前就爆发了
      • 完全等价于return $array[0];
      【解决方案8】:

      来自Laravel's helpers

      function head($array)
      {
          return reset($array);
      }
      

      数组被传值给函数,reset()会影响数组副本的内部指针,不会触及原来的 数组(注意如果数组为空则返回false)。

      使用示例:

      $data = ['foo', 'bar', 'baz'];
      
      current($data); // foo
      next($data); // bar
      head($data); // foo
      next($data); // baz
      

      另外,这里有一个替代方案。它稍微更快,但更有趣。如果数组为空,它可以轻松更改默认值:

      function head($array, $default = null)
      {
          foreach ($array as $item) {
              return $item;
          }
          return $default;
      }
      

      为了记录,这里是another answer of mine,表示数组的最后一个元素。

      【讨论】:

        【解决方案9】:

        这里的答案太多了,选择的答案适用于大部分情况。

        就我而言,我有一个二维数组,array_values 出于某种奇怪的原因正在删除内部数组上的键。所以我最终得到了这个:

        $keys = array_keys($myArray); // Fetches all the keys
        $firstElement = $myArray[$keys[0]]; // Get the first element using first key
        

        【讨论】:

          【解决方案10】:

          查找数组中的第一项和最后一项:

          // Get the first item in the array
          print $array[0]; // Prints 1
          
          // Get the last item in the array
          print end($array);
          

          【讨论】:

          • 这只有在你的数组有连续编号的键时才有效,从 0 开始并以 count()-1 结束。它不适用于 OP 的数组。
          • 即使使用数字键也不是说零是第一个键。添加的顺序很重要。 php $x = [1 =&gt; 'one', 0 =&gt; 'zero']; var_dump(reset($x)); string(3) "one"
          【解决方案11】:

          我想作者只是在寻找一种方法来从某个函数(例如mysql_fetch_row)获取数组的第一个元素,而不生成严格的“只有变量应该通过引用传递”。

          如果是这样,几乎这里描述的所有方式都会收到此消息...其中一些使用大量额外的内存来复制数组(或其中的一部分)。避免它的简单方法是在调用任何这些函数之前内联分配值:

          $first_item_of_array = current($tmp_arr = mysql_fetch_row(...));
          // or
          $first_item_of_array = reset($tmp_arr = func_get_my_huge_array());
          

          这样您不会在屏幕上或日志中看到 STRICT 消息,也不会创建任何额外的数组。它适用于索引和关联数组。

          【讨论】:

            【解决方案12】:
            $myArray = array (4 => 'apple', 7 => 'orange', 13 => 'plum');
            $arrayKeys = array_keys($myArray);
            
            // The first element of your array is:
            echo $myArray[$arrayKeys[0]];
            

            【讨论】:

            • 我没有按照接受答案中描述的方式进行。使用你的谢谢
            【解决方案13】:

            这在现实世界中并不是那么简单的反应。假设我们有这些可能的响应示例,您可以在某些库中找到这些示例。

            $array1 = array();
            $array2 = array(1,2,3,4);
            $array3 = array('hello'=>'world', 'foo'=>'bar');
            $array4 = null;
            
            var_dump('reset1', reset($array1));
            var_dump('reset2', reset($array2));
            var_dump('reset3', reset($array3));
            var_dump('reset4', reset($array4)); // Warning
            
            var_dump('array_shift1', array_shift($array1));
            var_dump('array_shift2', array_shift($array2));
            var_dump('array_shift3', array_shift($array3));
            var_dump('array_shift4', array_shift($array4)); // Warning
            
            var_dump('each1', each($array1));
            var_dump('each2', each($array2));
            var_dump('each3', each($array3));
            var_dump('each4', each($array4)); // Warning
            
            var_dump('array_values1', array_values($array1)[0]); // Notice
            var_dump('array_values2', array_values($array2)[0]);
            var_dump('array_values3', array_values($array3)[0]);
            var_dump('array_values4', array_values($array4)[0]); // Warning
            
            var_dump('array_slice1', array_slice($array1, 0, 1));
            var_dump('array_slice2', array_slice($array2, 0, 1));
            var_dump('array_slice3', array_slice($array3, 0, 1));
            var_dump('array_slice4', array_slice($array4, 0, 1)); // Warning
            
            list($elm) = $array1; // Notice
            var_dump($elm);
            list($elm) = $array2;
            var_dump($elm);
            list($elm) = $array3; // Notice
            var_dump($elm);
            list($elm) = $array4;
            var_dump($elm);
            

            如您所见,我们有几种“单线”解决方案在某些情况下效果很好,但并非全部。

            在我看来,你应该只处理数组。

            现在谈论性能,假设我们总是有数组,像这样:

            $elm = empty($array) ? null : ...($array);
            
            ...you would use without errors:
            $array[count($array)-1];
            array_shift
            reset
            array_values
            array_slice
            

            array_shiftreset快,也就是比[count()-1]快,这三个比array_valuesarray_slice快。

            【讨论】:

              【解决方案14】:

              还值得牢记的是您执行此操作的环境,因为详尽的检查可能很昂贵且并非总是必要的。

              例如,这个解决方案适用于我使用它的情况(但显然不能在所有情况下都依赖它......)

               /**
               * A quick and dirty way to determine whether the passed in array is associative or not, assuming that either:<br/>
               * <br/>
               * 1) All the keys are strings - i.e. associative<br/>
               * or<br/>
               * 2) All the keys are numeric - i.e. not associative<br/>
               *
               * @param array $objects
               * @return boolean
               */
              private function isAssociativeArray(array $objects)
              {
                  // This isn't true in the general case, but it's a close enough (and quick) approximation for the context in
                  // which we're using it.
              
                  reset($objects);
                  return count($objects) > 0 && is_string(key($objects));
              }
              

              【讨论】:

              • array(13, 'foo' =&gt; 'bar') 呢?
              • 就像我说的那样,它并非在所有情况下都有效,但它比大多数其他解决方案便宜得多,并且在许多(也许甚至是大多数?)您所在的情况下都可以正常工作可能需要它。请参阅方法注释中的假设。
              【解决方案15】:

              为您提供两种解决方案。

              解决方案 1 - 只需使用密钥。你还没有说你不能使用它。 :)

              <?php
                  // Get the first element of this array.
                  $array = array( 4 => 'apple', 7 => 'orange', 13 => 'plum' );
              
                  // Gets the first element by key
                  $result = $array[4];
              
                  // Expected result: string apple
                  assert('$result === "apple" /* Expected result: string apple. */');
              ?>
              

              解决方案 2 - array_flip() + key()

              <?php
                  // Get first element of this array. Expected result: string apple
                  $array = array( 4 => 'apple', 7 => 'orange', 13 => 'plum' );
              
                  // Turn values to keys
                  $array = array_flip($array);
              
                  // You might thrown a reset in just to make sure
                  // that the array pointer is at the first element.
                  // Also, reset returns the first element.
                  // reset($myArray);
              
                  // Return the first key
                  $firstKey = key($array);
              
                  assert('$firstKey === "apple" /* Expected result: string apple. */');
              ?>
              

              解决方案 3 - array_keys()

              echo $array[array_keys($array)[0]];
              

              【讨论】:

                【解决方案16】:
                $first_value = reset($array); // First element's value
                $first_key = key($array); // First element's key
                

                【讨论】:

                • 我还没有实际测试过,但似乎这种方法是最有效的。
                • 唯一的问题是询问值的问题,而不是键。因此应该使用 current($array) 而不是 key($array)
                • @zmonteca $first_value = reset($array);这里你得到了值,reset() 函数回退数组内部指针并返回第一个元素。
                • 最佳答案!正在寻找 key() 等价性来获得第一个值。这有帮助!
                • 如果数组为空怎么办? reset() 将返回 false,如果您希望数组包含 bool 值,这可能会导致错误。
                【解决方案17】:

                您可以使用语言结构“列表”获取第 N 个元素:

                // First item
                list($firstItem) = $yourArray;
                
                // First item from an array that is returned from a function
                list($firstItem) = functionThatReturnsArray();
                
                // Second item
                list( , $secondItem) = $yourArray;
                

                使用array_keys 函数,您可以对键执行相同操作:

                list($firstKey) = array_keys($yourArray);
                list(, $secondKey) = array_keys($yourArray);
                

                【讨论】:

                • 这正是我所做的:list($first_value) = $my_array; 在我看来,这是最好的选择。它没有此处提供的其他答案的问题:没有“矫枉过正”,因为它不复制数组或创建新数组。没有“引用”:数组没有被修改。没有“重置”:数组内部指针没有变化...
                • 非常优雅的解决方案,但是当数组为空时会抛出 E_NOTICE。
                • @Mike 是的,但它不再那么优雅了:)
                • 这不是错了吗?!仅当数组键为int 时才有效,尝试执行list($firstItem) = array('key1' =&gt; 'value1'); 会出现错误Notice: Undefined offset: 0
                • 澄清一下:list($x) = foo(); 等同于$x = foo()[0];。请注意,这不一定与“获取第一项”相同,因为即使是整数索引数组也可能没有键为 0 的元素。在我的情况下,我正在执行“list($order) = get_order($user) ;"但是“get_order”返回的是由 ID 键入的订单,该 ID 通常不是 0。正如 @Sergiy 所说,array_values() 解决了这个问题,但降低了代码的效率和(更重要的是)可读性。
                【解决方案18】:

                正如迈克指出的(最简单的方法):

                $arr = array( 4 => 'apple', 7 => 'orange', 13 => 'plum' )
                echo reset($arr); // Echoes "apple"
                

                如果要获取密钥:(reset后执行)

                echo key($arr); // Echoes "4"
                

                来自PHP's documentation

                混合 重置(数组&$array);

                说明:

                reset()数组的 内部指针回退到第一个元素并返回第一个数组元素的值,如果数组是 空。

                【讨论】:

                • 虽然是通过引用传递给reset,但是并没有修改原来的数组。我猜这就是 hsz 不想通过引用传递它的原因..?
                • 数组的迭代器被修改。如果您在 foreach 中使用主题数组执行此操作,您会搞砸的。
                • @Zenexer 这并不总是(通常)正确。通常在实践中,foreach 将复制它循环通过的数组。
                • @Angger 重置后,你可以打电话给key($arr),你会得到'4'(添加到答案中)
                • @Zenexer 和 Luke Cousins 都不正确:1) foreach 不使用数组的内部指针 - 而是创建它自己的指针。很容易在 foreach 中检查调用 reset - 循环将按照它的方式进行,reset() 没有任何影响。 2) 不,foreach 不会创建数组的副本!!!它只创建自己的指针(甚至不是现有指针的副本 - 它也很容易检查,在 foreach 之前调用 next())。
                【解决方案19】:

                原始答案,但代价高昂 (O(n)):

                array_shift(array_values($array));
                

                在 O(1) 中:

                array_pop(array_reverse($array));
                

                其他用例等...

                如果修改(在重置数组指针的意义上)$array 没有问题,您可以使用:

                reset($array);
                

                如果需要数组“复制”,理论上这应该更有效:

                array_shift(array_slice($array, 0, 1));
                

                使用 PHP 5.4+(但如果为空可能会导致索引错误):

                array_values($array)[0];
                

                【讨论】:

                • +1 用于巧妙的解决方法,以防止使用 array_values() 修改原始数组
                • 我明白了:严格标准:只能通过引用传递变量。顺便说一句,很好的解决方法
                • 这不是有点矫枉过正吗?如果数组包含数千个元素怎么办?仅仅为了获得它的第一个元素而创建一个全新的数组是否合理? list()reset() 在我看来是更好的解决方案。
                • 我同意。与重置并返回当前值的一行相比,总的过度杀伤和异常资源繁重:reset($array);
                • -1 正如上述评论者所说。让我感到困惑的是,这有 101 个赞成票。
                【解决方案20】:

                没有人建议使用 ArrayIterator 类:

                $array = array( 4 => 'apple', 7 => 'orange', 13 => 'plum' );
                $first_element = (new ArrayIterator($array))->current();
                echo $first_element; //'apple'
                

                绕过 OP 的引用规定。

                【讨论】:

                • 这应该是正确的答案。也可以获取第一个密钥:(new ArrayIterator($array))-&gt;key()。请注意,当数组为空时,它会为值和键正确返回 null(而不是返回像 false 这样的伪值)。不幸的是,它不适用于 Laravel 的 Collection 类,它总是返回 null
                【解决方案21】:

                PHP 7.3 添加了两个函数,用于直接获取数组的第一个和最后一个键,而无需修改原始数组,也无需创建任何临时对象:

                除了语义上的意义之外,这些函数甚至不移动数组指针(就像foreach 会做的那样)。

                有了键,可以直接通过键获取值。


                示例(所有示例都需要 PHP 7.3+)

                获取第一个/最后一个键和值:

                $my_array = ['IT', 'rules', 'the', 'world'];
                
                $first_key = array_key_first($my_array);
                $first_value = $my_array[$first_key];
                
                $last_key = array_key_last($my_array);
                $last_value = $my_array[$last_key];
                

                获取第一个/最后一个值作为单行,假设数组不能为空

                $first_value = $my_array[ array_key_first($my_array) ];
                
                $last_value = $my_array[ array_key_last($my_array) ];
                

                获取第一个/最后一个值作为单行,默认为空数组:

                $first_value = empty($my_array) ? 'default' : $my_array[ array_key_first($my_array) ];
                
                $last_value = empty($my_array) ? 'default' : $my_array[ array_key_last($my_array) ];
                

                【讨论】:

                • null-coalescing operator缩短,通常默认为null,所以:$first_value = $my_array[array_key_first($my_array)] ?? null;
                • 从 PHP 7.3 开始,这应该是选择的答案。
                【解决方案22】:

                大部分工作!但是对于快速单行(低资源)调用:

                $array = array( 4 => 'apple', 7 => 'orange', 13 => 'plum' );
                echo $array[key($array)];
                
                // key($array) -> will return the first key (which is 4 in this example)
                

                虽然这很有效,而且还不错,但也请参阅我的附加答案: https://stackoverflow.com/a/48410351/1804013

                【讨论】:

                【解决方案23】:

                试试这个:

                $fruits = array( 4 => 'apple', 7 => 'orange', 13 => 'plum' );
                echo reset($fruits)."\n";

                【讨论】:

                  【解决方案24】:

                  获取第一个元素:

                  array_values($arr)[0]
                  

                  获取最后一个元素

                  array_reverse($arr)[0]
                  

                  【讨论】:

                  • 数字键使用array_reverse 保留,因此仍将返回第一个元素。 3v4l.org/2729s
                  【解决方案25】:
                  $arr = array( 4 => 'apple', 7 => 'orange', 13 => 'plum' );
                  foreach($arr as $first) break;
                  echo $first;
                  

                  输出:

                  apple
                  

                  【讨论】:

                    【解决方案26】:

                    我不喜欢摆弄数组的内部指针,但是用array_keys()array_values()构建第二个数组也效率低下,所以我通常这样定义:

                    function array_first(array $f) {
                        foreach ($f as $v) {
                            return $v;
                        }
                        throw new Exception('array was empty');
                    }
                    

                    【讨论】:

                      【解决方案27】:

                      array_sliceimplode 的组合很好:

                      $arr = array(1, 2, 3);
                      echo implode(array_slice($arr, 0, 1));
                      // Outputs 1
                      
                      /*---------------------------------*/
                      
                      $arr = array(
                          'key_1' => 'One',
                          'key_2' => 'Two',
                          'key_3' => 'Three',
                      );
                      echo implode(array_slice($arr, 0, 1));
                      // Outputs One
                      

                      【讨论】:

                        【解决方案28】:

                        使用 array_keys() 以数字索引数组的形式访问关联数组的键,然后可以再次将其用作数组的键。

                        当解为arr[0]

                        (请注意,由于带有键的数组是从 0 开始的索引,因此第一个 元素是索引 0)

                        您可以使用一个变量,然后减去一个,以获得您的逻辑,即1 =&gt; 'apple'

                        $i = 1;
                        $arr = array( 4 => 'apple', 7 => 'orange', 13 => 'plum' );
                        echo $arr[array_keys($arr)[$i-1]];
                        

                        输出:

                        apple
                        

                        好吧,为简单起见 - 只需使用:

                        $arr = array( 4 => 'apple', 7 => 'orange', 13 => 'plum' );
                        echo $arr[array_keys($arr)[0]];
                        

                        输出:

                        apple
                        

                        第一种方法不仅是第一个元素,而且可以将关联数组视为索引数组。

                        【讨论】:

                          【解决方案29】:

                          用途:

                          $first = array_slice($array, 0, 1);  
                          $val= $first[0];
                          

                          默认情况下,array_slice 不保留键,因此我们可以安全地使用零作为索引。

                          【讨论】:

                            【解决方案30】:

                            简单地做:

                            array_shift(array_slice($array,0,1));
                            

                            【讨论】:

                            • 这是一种没有吸引力(并且无法解释)的技术,因为有单一调用技术可以实现相同的目标。
                            猜你喜欢
                            • 2011-05-04
                            • 1970-01-01
                            • 1970-01-01
                            • 2019-04-19
                            • 2016-07-27
                            • 2012-06-05
                            • 2019-03-26
                            • 1970-01-01
                            相关资源
                            最近更新 更多