私は配列を持っています:
array( 4 => 'apple', 7 => 'orange', 13 => 'plum' )
この配列の最初の要素を取得したいと思います。期待される結果:文字列 apple
1つの要件:参照渡しでは実行できないためarray_shift
、適切な解決策ではありません。
これどうやってするの?
&$array
パラメータとして使用してはいけません。
私は配列を持っています:
array( 4 => 'apple', 7 => 'orange', 13 => 'plum' )
この配列の最初の要素を取得したいと思います。期待される結果:文字列 apple
1つの要件:参照渡しでは実行できないためarray_shift
、適切な解決策ではありません。
これどうやってするの?
&$array
パラメータとして使用してはいけません。
回答:
元の回答ですが、費用がかかります(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];
list()
そしてreset()
私の意見に対してはるかに良い解決策です。
マイクが指摘したように(可能な最も簡単な方法):
$arr = array( 4 => 'apple', 7 => 'orange', 13 => 'plum' )
echo reset($arr); // Echoes "apple"
キーを取得したい場合:(リセット後に実行してください)
echo key($arr); // Echoes "4"
PHPのドキュメントから:
混合 リセット(配列&$ array);
説明:
reset()は、配列の内部ポインタを最初の要素に巻き戻し、最初の配列要素の値を返します。配列が空の場合はFALSEを返します。
foreach
件名の配列で行うと、失敗します。
foreach
は、ループしている配列をコピーします。
key($arr)
、あなたは「4」(答えに追加)を取得します
reset()
。2)いいえ、foreachは配列のコピーを作成しません!!! それはそれ自身のポインタを作成するだけです(既存のもののコピーでさえありません-確認するのも簡単で、next()
foreachの前に呼び出します)。
$first_value = reset($array); // First element's value
$first_key = key($array); // First element's key
$arr = array( 9 => 'apple', 7 => 'orange', 13 => 'plum' );
echo reset($arr); // echoes 'apple'
現在のポインタ位置を失いたくない場合は、配列のエイリアスを作成してください。
reset()
すでに最初の要素を返しているので、使用する必要はありませんcurrent()
- echo reset($arr)
十分でしょう
current($array)
PHPマニュアルによると、配列の最初の要素を取得できます。
すべての配列には、その「現在の」要素への内部ポインタがあり、配列に挿入された最初の要素に初期化されます。
したがって、配列ポインタを再配置するまで機能します。それ以外の場合は、配列をリセットする必要があります。
current($array)
配列ポインタが「現在」最初の要素を指している場合にのみ機能しますreset($array)
。それ以外の場合は必要です。
current()
PHPのドキュメントにはこれが反映されていませんが、参照は必要なくなったようです。したがって、これが最良の解決策になったと思います。
N番目の要素は、言語構造「list」で取得できます。
// 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;
。私の意見では、最良のオプションです。ここに示されている他の回答の問題はありません。アレイをコピーしたり、アレイを作成したり、新しいアレイを作成したりしないため、「やり過ぎ」はありません。「参照」なし:配列は変更されません。「リセット」なし:配列の内部ポインターは変更されません...
int
である場合にのみ機能list($firstItem) = array('key1' => 'value1');
します。実行するとエラーが発生しますNotice: Undefined offset: 0
list($x) = foo();
同等$x = foo()[0];
です。これは、「最初の項目を取得する」と必ずしも同じではないことに注意してください。整数でインデックス付けされた配列でも、キー0の要素がない場合があるためです。私の場合、「list($ order)= get_order($ user) ; " しかし、「get_order」は、通常0ではないIDでキー付けされた注文を返していました。@ Sergiyが言うように、array_values()はこれを修正しますが、コードの効率と(さらに重要なことに)可読性を損ないます。
PHP 5.4以降:
array_values($array)[0];
$array_values = array_values($array); $value = $array_values[0];
PHP 7.3では、元の配列を変更せずに一時オブジェクトを作成せずに、配列の最初と最後のキーを直接取得するための2つの関数が追加されました。
これらの関数は、意味的に意味があることは別にして、(foreach
そうするように)配列ポインターを移動することすらありません。
キーがあれば、キーによって直接値を取得できます。
$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) ];
と仮定します:
$array = array( 4 => 'apple', 7 => 'orange', 13 => 'plum' );
ただ使用する:
$array[key($array)]
最初の要素を取得する、または
key($array)
最初のキーを取得します。
または、削除したい場合は、最初のリンクを解除できます。
current
はなぜですか?
一部の配列はlist
、reset
またはのような関数では機能しませんcurrent
。多分、それらは「偽の」配列です-たとえば、部分的にArrayIteratorを実装しています。
配列に関係なく最初の値を取得したい場合は、イテレータを短絡できます:
foreach($array_with_unknown_keys as $value) break;
その後、値はで使用可能に$value
なり、ループは最初の反復の後で中断します。これは、潜在的に大きな配列をarray_unshift(array_values($ arr))のような関数にコピーするよりも効率的です。
この方法でもキーを取得できます。
foreach($array_with_unknown_keys as $key=>$value) break;
これを関数から呼び出す場合は、早期に戻るだけです。
function grab_first($arr) {
foreach($arr as $value) return $value;
}
Laravelのヘルパーから:
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;
}
これをシンプルにしてください!ここには多くの正しい答えがありますが、すべての混乱を最小限に抑えるために、これらの2つは機能し、多くのオーバーヘッドを削減します。
key($array)
配列の最初のキーを取得します配列
current($array)
の最初の値を取得します
編集:
以下のコメントについて。次の例は出力します: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
現在の要素に等しい。配列の先頭にポインタをリセットして、それが実際に先頭にあることを確認する必要があります。
単に行います:
array_shift(array_slice($array,0,1));
私はそうするでしょうecho current($array)
。
current()
非参照が渡されても問題ではなく、エラーにもなりません。ポインターがまだ最初にある場合、これは機能します。
reset
は「参照によって渡される変数のみ」という通知が生成されますが、生成されcurrent
ません:オンラインPHPエディターの例current(array_filter(...));
。
next()
、を使用する関数、end()
または配列の内部ポインターを変更する他の関数から配列を受け取ったと想像してください。私の例でcurrent()
は、内部ポインタが配列の「範囲外」であるため、nullを返します。しかし、それは「事実上」、任意の/ランダムな要素を指す場合もあります。
$myArray = array (4 => 'apple', 7 => 'orange', 13 => 'plum');
$arrayKeys = array_keys($myArray);
// The first element of your array is:
echo $myArray[$arrayKeys[0]];
$array=array( 4 => 'apple', 7 => 'orange', 13 => 'plum' );
$firstValue = each($array)[1];
これはarray_values()
、each()
関数が配列全体をコピーしないためよりもはるかに効率的です。
詳細については、http: //www.php.net/manual/en/function.each.phpを参照してください
不器用な方法は次のとおりです。
$foo = array( 4 => 'apple', 7 => 'orange', 13 => 'plum' );
function get_first ($foo) {
foreach ($foo as $k=>$v){
return $v;
}
}
print get_first($foo);
reset()
れる前に配列ポインタがリセットされるため、使用することもできforeach
ます。
最初の要素を取得します。
array_values($arr)[0]
最後の要素を取得
array_reverse($arr)[0]
これらのほとんどは動作します!しかし、迅速な単一行(リソース不足)呼び出しの場合:
$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
current($array)
、を使用するのと同じです。これは、配列の内部ポインタがとにかく最初の要素にあることが必要であり、その場合echo reset($array)
が最も適切です。
ここではarray_valuesを使用するのが最善の策だと思います。その関数の結果からインデックス0の値を返し、「apple」を取得できます。
これは少し遅いですが、配列に子として配列要素が含まれているため、最初の配列要素の文字列表現を取得できないという問題が発生しました。することで、PHPの使用してcurrent()
機能を、私はこれを管理します:
<?php
$original = array(4 => array('one', 'two'), 7 => array('three', 'four'));
reset($original); // to reset the internal array pointer...
$first_element = current($original); // get the current element...
?>
現在のすべての解決策のおかげでこの答えを得ることができましたが、これが誰かに役立つことを願っています!
あなたのための2つのソリューション。
解決策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]];
これは現実の世界ではそれほど単純な対応ではありません。一部のライブラリで見つけることができる可能な応答のこれらの例があるとします。
$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行」ソリューションがあります。
私の意見では、そのハンドラーは配列でのみ使用する必要があります。
次のように、常に配列があると仮定して、パフォーマンスについて説明します。
$elm = empty($array) ? null : ...($array);
...you would use without errors:
$array[count($array)-1];
array_shift
reset
array_values
array_slice
array_shift
は[よりも高速reset
、つまり[count()-1]よりも高速でarray_values
あり、これら3つはおよびよりも高速ですarray_slice
。
作者が配列の最初の要素をいくつかの関数(たとえばmysql_fetch_rowなど)から取得した後、STRICT "変数のみを参照で渡す必要がある"を生成せずに配列を取得する方法を探していたと想像します。
その場合は、ここで説明するほとんどすべての方法でこのメッセージが表示されます。それらのいくつかは、配列(またはその一部)を複製するために大量の追加メモリを使用します。これを回避する簡単な方法は、これらの関数を呼び出す前にインラインで値を割り当てるだけです。
$first_item_of_array = current($tmp_arr = mysql_fetch_row(...));
// or
$first_item_of_array = reset($tmp_arr = func_get_my_huge_array());
この方法では、画面やログにSTRICTメッセージが表示されず、追加の配列も作成されません。インデックス付きのAND連想配列の両方で機能します。
「リスト」の例は好きですが、「リスト」は課題の左側でのみ機能します。変数を割り当てたくない場合は、一時的な名前を作成する必要があります。一時的な名前は、スコープを汚染し、最悪の場合は既存の値を上書きします。
list($x) = some_array();
var_dump($x);
上記は$ xの既存の値を上書きし、$ x変数はこのスコープがアクティブである限り(この関数/メソッドの最後、またはトップレベルにいる場合は永久に)ハングします。これは、call_user_funcと無名関数を使用して回避できますが、不格好です。
var_dump(call_user_func(function($arr) { list($x) = $arr; return $x; },
some_array()));
このような無名関数を使用すると、参照渡しを使用していても、resetとarray_shiftを実際に使用できます。これは、関数を呼び出すと引数がバインドされ、これらの引数を参照渡しすることができるためです。
var_dump(call_user_func(function($arr) { return reset($arr); },
array_values(some_array())));
ただし、call_user_funcがこの一時的な割り当てを内部で実行するため、これは実際にはやりすぎです。これにより、警告渡しやエラーなしに、参照渡し関数を値渡しのように扱うことができます。
var_dump(call_user_func('reset', array_values(some_array())));
これを試して:
$fruits = array( 4 => 'apple', 7 => 'orange', 13 => 'plum' );
echo reset($fruits)."\n";