私は配列があります:
array( 4 => 'Apple', 7 => 'orange', 13 => 'Plum' )
この配列の最初の要素を取得したいです。期待される結果: ひも Apple
1つの要件: 参照渡しでは実行できない したがって、array_shift
は適切な解決策ではありません。
これどうやってするの?
元の答え、しかし高価です(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];
マイクが指摘したように(最も簡単な方法):
$arr = array( 4 => 'Apple', 7 => 'orange', 13 => 'Plum' )
echo reset($arr); //echoes "Apple"
キーを取得したい場合:(リセット後に実行してください)
echo key($arr); //echoes "4"
From PHPのドキュメント :
mixed reset (配列&$配列);
説明:
reset() 最初の要素へのarray's内部ポインタを巻き戻し、最初の要素の値を返します。配列が空の場合はFALSEを返します。
$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'
現在のポインタ位置を失いたくない場合は、単に配列のエイリアスを作成してください。
current($array)
PHP Manual に従って、配列の最初の要素を取得することができます。
すべての配列には、その配列に挿入された最初の要素に初期化される「現在の」要素への内部ポインタがあります。
そのため、配列ポインタを再配置するまではうまくいきます。そうでなければ、配列をリセットする必要があります。
N番目の要素は言語構造体 "list"で得ることができます:
// 1st item
list($firstItem) = $yourArray;
// 1st item from an array that is returned from function
list($firstItem) = functionThatReturnsArray();
// 2nd item
list( , $secondItem) = $yourArray;
array_keys関数を使えば、キーに対しても同じことができます。
list($firstKey) = array_keys($yourArray);
list(, $secondKey) = array_keys($yourArray);
PHP 5.4以降:
array_values($array)[0];
と仮定します。
$array = array( 4 => 'Apple', 7 => 'orange', 13 => 'Plum' );
ただ使用してください:
$array[key($array)]
最初の要素を取得する
key($array)
最初のキーを取得する.
削除したい場合は、最初のリンクを解除することもできます。
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) ];
いくつかの配列は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;
}
簡単に
array_shift(array_slice($array,0,1));
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;
}
記録のために、これは もう一つの答え の、配列の最後の要素です。
私はecho current($array)
をするでしょう。
$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()
よりはるかに効率的です。
$arr = array( 4 => 'Apple', 7 => 'orange', 13 => 'Plum' );
foreach($arr as $first) break;
echo $first;
出力:
Apple
くだらない方法は:
$foo = array( 4 => 'Apple', 7 => 'orange', 13 => 'Plum' );
function get_first ($foo) {
foreach ($foo as $k=>$v){
return $v;
}
}
print get_first($foo);
これらの作業の大部分!ただし、単一行(低リソース)の迅速な呼び出しには:
$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
最初の要素を取得する:
array_values($arr)[0]
最後の要素を取得
array_reverse($arr)[0]
これを単純にしてください。ここにたくさんの正しい答えがありますが、混乱を最小限にするためです。これら二つは働き、たくさんのオーバーヘッドを減らします。
key($array)
=は配列の最初のキーを取得しますcurrent($array)
=は配列の最初の値を取得します
つかいます:
$first = array_slice($array, 0, 1);
$val= $first[0];
デフォルトでは、array_slice
はキーを保存しないので、インデックスとして安全にゼロを使用できます。
これはゲームには少し遅れていますが、私は私の配列がその中に子として配列要素を含んでいるという問題を抱えていたので、最初の配列要素の文字列表現を得ることができませんでした。 によって、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 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 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 - array_keys()
echo $array[array_keys($array)[0]];
ここでは array_values を使用するのが最善の策です。その関数の結果からインデックス0の値を返して「Apple」を取得できます。
これは現実の世界ではそれほど単純な対応ではありません。私たちはあなたがいくつかの図書館で見つけることができる可能性のある応答のこの例を持っていることを後悔します。
$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_shiftはリセットより速く、[count() - 1]より速く、この3つはarray_valuesとarray_sliceより速い
徹底的なチェックはコストがかかり、常に必要というわけではないので、これを行っている状況を覚えておく価値もあります。
例えば、この解決法は私が使用している状況ではうまくいきます(しかし明らかにすべての場合に頼ることはできません...)
/**
* 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));
}
とにかく昔の記事ですが…作者は、STRICT "変数のみ参照渡し"を生成せずに、ある関数(例えばmysql_fetch_row)からそれを取得した後にarrayの最初の要素を取得する方法を探していたと思います。そうであれば、ここで説明されているすべての方法でこのメッセージが表示されます。それらのいくつかは配列(またはその一部)を複製する多くの追加メモリを使用します。これを避ける簡単な方法は、これらの関数を呼び出す前に値をインラインで割り当てることです。
$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連想型 配列で動作します。
これを試して:
$fruits = array( 4 => 'Apple', 7 => 'orange', 13 => 'Plum' );
echo reset($fruits)."\n";
Sarfrazが投稿した内容に少し変更があります
$array = array(1, 2, 3, 4, 5);
$output = array_slice($array, 0, 1);
print_r ($output);
私は配列の内部ポインタをいじるのは好きではありませんが、array_keys()
やarray_values()
を使って2番目の配列を作るのも非効率的ですので、私は通常これを定義します:
function array_first(array $f) {
foreach ($f as $v) {
return $v;
}
throw new Exception('array was empty');
}
私は "list"の例が好きですが、 "list"は代入式の左側でしか働きません。変数を割り当てたくない場合は、一時的な名前の作成を余儀なくされます。これは、せいぜいスコープを汚染し、最悪の場合は既存の値を上書きするからです。
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())));
ArrayIteratorクラスの使用を提案した人はいません。
$array = array( 4 => 'Apple', 7 => 'orange', 13 => 'Plum' );
$first_element = (new ArrayIterator($array))->current();
echo $first_element; //'Apple'
参照によるOPの規定を回避します。
array_keys()
を使用して、連想配列のキーに数値のインデックス付き配列としてアクセスします。これは、再び配列のキーとして使用できます。
ソリューションがarr[0]
の場合:
(キーを持つ配列は0ベースのインデックスであるため、最初の要素はインデックス0であることに注意してください)
1 => 'Apple'
という変数を使用してから1つ引くと、ロジックを取得できます。
$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
最初のメソッドでは、最初の要素だけでなく、連想配列をインデックス付き配列のように扱うことができます。
array_slice
とimplode
を組み合わせた素敵なもの:
$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
このコーディングを使って最初の要素を取得できます
$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;