Get the first element of an array
我有一个数组:
我想得到这个数组的第一个元素。预期结果:字符串EDOCX1[1]
一个要求:不能通过引用传递来实现,所以
我该怎么做?
原始答案,但代价高昂(o(n)):
1 |
在O(1)中:
1 |
用其他用例的评论等建议编辑…
如果修改(在重置数组指针的意义上)
1 |
如果需要数组"副本",这在理论上应该更有效:
1 |
使用php 5.4+(但如果为空可能会导致索引错误):
1 |
正如迈克指出的(最简单的方法):
如果您想获取密钥:(重置后执行)
1 |
从PHP文档中:
mixed reset ( array &$array );
描述:
reset() rewinds array's internal pointer to the first element and returns the value of the first array element, or FALSE if the array is
empty.
1 2 |
希望这有帮助。:)
如果不想丢失当前指针位置,只需为数组创建一个别名。
根据php手册,可以得到数组的第一个元素
Every array has an internal pointer to its"current" element, which is initialized to the first element inserted into the array.
所以它一直工作直到你重新定位数组指针,否则你必须重置数组。
您可以使用语言构造"list"获得nth元素:
1 2 3 4 5 6 7 8 |
使用数组键功能,您可以对键执行相同的操作:
1 2 |
PHP 5.4 +:
1 |
假设:
1 |
只需使用:
1 |
获取第一个元素或
1 |
拿到第一把钥匙。
或者,如果要删除第一个链接,可以取消链接。
有些数组不适用于
如果不管数组如何,都要提取第一个值,则可以将迭代器短路:
1 | foreach($array_with_unknown_keys as $value) break; |
然后您的值将在
你也可以这样拿钥匙:
1 | foreach($array_with_unknown_keys as $key=>$value) break; |
如果您是从函数调用此函数,只需提前返回:
1 2 3 | function grab_first($arr) { foreach($arr as $value) return $value; } |
php 7.3添加了两个函数,用于直接获取数组的第一个和最后一个键,而不修改原始数组,也不创建任何临时对象:
- 阿雷耶基耶希
- 最后一次
除了语义上有意义外,这些函数甚至不会移动数组指针(就像
有了这些键,就可以直接通过键来获取值。
示例(所有示例都需要php 7.3+)获取第一个/最后一个键和值:1 2 3 4 5 6 7 | $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]; |
将第一个/最后一个值作为一行程序获取,假定数组不能为空:
1 2 3 | $first_value = $my_array[ array_key_first($my_array) ]; $last_value = $my_array[ array_key_last($my_array) ]; |
将第一个/最后一个值作为一行程序获取,空数组的默认值为:
1 2 3 |
来自拉拉维尔的助手:
1 2 3 4 |
数组按值传递给函数时,reset()会影响数组副本的内部指针,它不会接触到原始数组。(注意,如果数组为空,则返回
使用实例:
1 2 3 4 5 6 |
还有一个选择。它非常快,但更有趣的是,如果数组为空,它可以轻松地更改默认值:
1 2 3 4 5 6 7 8 | function head($array, $default = null) { foreach ($array as $item) { return $item; } return $default; } |
对于记录,这里是我的另一个答案,对于数组的最后一个元素。
简单地做:
1 |
我会做
1 2 3 | $arr = array( 4 => 'apple', 7 => 'orange', 13 => 'plum' ); foreach($arr as $first) break; echo $first; |
输出:
1 | apple |
1 2 3 4 5 | $myArray = array (4 => 'apple', 7 => 'orange', 13 => 'plum'); $arrayKeys = array_keys($myArray); // the first element of your array is: echo $myArray[$arrayKeys[0]]; |
这比
有关详细信息,请参阅http://www.php.net/manual/en/function.each.php
一个笨拙的方法是:
1 2 3 4 5 6 7 8 9 | $foo = array( 4 => 'apple', 7 => 'orange', 13 => 'plum' ); function get_first ($foo) { foreach ($foo as $k=>$v){ return $v; } } print get_first($foo); |
大部分的工作!但对于快速的单线(低资源)呼叫:
1 2 3 4 |
虽然这是可行的,而且相当不错,请看我的附加答案:https://stackoverflow.com/a/48410351/1804013
获取第一个元素:
1 |
获取最后一个元素
1 |
保持简单!这里有很多正确的答案,但要尽量减少混淆。这两项工作可以减少很多开销。
我认为在这里使用数组值是最好的选择。您可以从该函数的结果返回索引零处的值,得到"apple"。
用途:
1 2 |
默认情况下,
两种解决方案。
解决方案1-只需使用键。你没有说过,你不能用它。:)
1 2 3 4 5 6 7 8 9 10 |
解决方案2-array_flip()+key())
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | <?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 an reset in // just to make sure that the array pointer is at first element // also reset return the first element // reset($myArray); // return first key $firstKey = key($array); assert('$firstKey ==="apple" /* Expected result: string apple. */'); ?> |
解决方案3-数组键()。
1 |
这对游戏来说有点晚了,但是我遇到了一个问题,我的数组中包含了数组元素,作为其中的子元素,因此我不能只获得第一个数组元素的字符串表示。通过使用php的
1 2 3 4 5 |
多亏了目前所有的解决方案帮助我找到了这个答案,我希望这能帮助一些人!
这不是现实世界中简单的反应。最重要的是,我们有一些可能的响应示例,您可以在一些库中找到。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | $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); |
如您所见,我们有几个"一线"解决方案在某些情况下工作得很好,但并非全部。
在我看来,您应该只对数组使用该处理程序。
现在讨论性能,假设我们总是使用数组,如下所示:
1 2 3 4 5 6 7 8 | $elm = empty($array)? null : ...($array); ...you would use without errors: $array[count($array)-1] ; array_shift reset array_values array_slice |
数组移位比重置更快,比[count()-1]更快,这三个数组移位比数组值和数组切片更快。
没有人建议使用arrayIterator类:
1 2 3 |
绕过操作的引用规定。
旧的帖子,但无论如何…我想作者只是在从某个函数(例如mysql_fetch_row)获取数组的第一个元素后,寻找一种方法,而不生成严格的"只有变量应该通过引用传递"。如果是这样,这里描述的所有方法都会得到这个消息…其中一些使用了大量额外的内存来复制一个数组(或其中的某个部分)。避免这种情况的一个简单方法是,在调用这些函数之前直接将值赋给inline:
1 2 3 | $first_item_of_array = current($tmp_arr = mysql_fetch_row(...)); // or $first_item_of_array = reset($tmp_arr = func_get_my_huge_array()); |
这样,无论在日志中还是在屏幕上都不会收到严格的消息,也不会创建任何其他数组。它同时适用于索引数组和关联数组
我喜欢"列表"示例,但是"列表"只在任务的左侧起作用。如果我们不想分配一个变量,我们将被迫编一个临时名称,它最多会污染我们的作用域,最坏的情况下会覆盖现有的值:
上面的内容将覆盖$X的任何现有值,只要这个作用域是活动的,$X变量就会一直挂起(这个函数/方法的结尾,或者如果我们是顶级的,则永远挂起)。这可以通过使用call_user_func和匿名函数来解决,但这很难做到:
1 2 |
如果我们使用类似这样的匿名函数,我们实际上可以通过重置和数组移位来摆脱,即使它们使用的是按引用传递。这是因为调用函数将绑定其参数,并且这些参数可以通过引用传递:
1 2 |
但是,这实际上是多余的,因为call-user-func将在内部执行这个临时分配。这使我们可以将传递引用函数视为传递值,而不出现任何警告或错误:
1 |
Sarfraz发布的一个小变化是:
1 2 3 |
同样值得记住的是,你在做这件事时所处的环境,因为详尽的检查可能是昂贵的,并不总是必要的。
例如,对于我使用它的情况,这个解决方案可以很好地工作(但显然不能在所有情况下都依赖它…)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | /** * 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)); } |
试试这个:
我不喜欢摆弄数组的内部指针,但是用
1 2 3 4 5 6 | function array_first(array $f) { foreach ($f as $v) { return $v; } throw new Exception('array was empty'); } |
使用
当溶液为
(Note, that since the array with the keys is 0-based index, the 1st
element is index 0)
您可以使用一个变量,然后减去一个,得到您的逻辑,即
1 2 3 | $i = 1; $arr = array( 4 => 'apple', 7 => 'orange', 13 => 'plum' ); echo $arr[array_keys($arr)[$i-1]]; |
输出:
1 | apple |
嗯,为了简单起见-只需使用:
1 2 |
输出:
1 | apple |
通过第一个方法,不仅可以使用第一个元素,而且可以将关联数组视为索引数组。
很好的一个,结合了
1 2 3 4 5 6 7 8 9 10 11 12 13 | $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 |
您可以使用此编码获取第一个元素
1 2 |
或使用
1 2 3 4 5 6 7 8 9 10 11 | $i=0; foreach($array as $arr) { if($i==0) { $first_element=$arr; break; } $i++; } echo $first_element; |
这里的答案太多,所选的答案对大多数情况都有效。在我的例子中,我有一个二维数组,由于一些奇怪的原因,数组的值是删除内部数组上的键。所以我就这样结束了
1 2 | $keys = array_keys($myArray); // fetches all the keys $firstElement = $myArray[$keys[0]]; // Get the first element using first key |
查找数组中的第一个和最后一个项
1 2 3 4 5 | // get the first item in the array print $array[0]; // prints 1 // get the last item in the array print end($array); |