web-dev-qa-db-ja.com

配列の最初の要素を取得する

私は配列があります: 

array( 4 => 'Apple', 7 => 'orange', 13 => 'Plum' )

この配列の最初の要素を取得したいです。期待される結果: ひも Apple 

1つの要件: 参照渡しでは実行できない したがって、array_shiftは適切な解決策ではありません。

これどうやってするの?

919
hsz

元の答え、しかし高価です(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];
1189
blueyed

マイクが指摘したように(最も簡単な方法):

$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を返します。

742
lepe
$first_value = reset($array); // First Element's Value
$first_key = key($array); // First Element's Key

お役に立てれば。 :)

254
Ijas Ameenudeen
$arr = array( 9 => 'Apple', 7 => 'orange', 13 => 'Plum' );
echo reset($arr); // echoes 'Apple'

現在のポインタ位置を失いたくない場合は、単に配列のエイリアスを作成してください。

88
yoda

current($array)

PHP Manual に従って、配列の最初の要素を取得することができます。 

すべての配列には、その配列に挿入された最初の要素に初期化される「現在の」要素への内部ポインタがあります。

そのため、配列ポインタを再配置するまではうまくいきます。そうでなければ、配列をリセットする必要があります。

69
Tofeeq

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);
63

PHP 5.4以降:

array_values($array)[0];
52
Samer Ata

と仮定します。

$array = array( 4 => 'Apple', 7 => 'orange', 13 => 'Plum' );

ただ使用してください:

$array[key($array)]

最初の要素を取得する

key($array)

最初のキーを取得する.

削除したい場合は、最初のリンクを解除することもできます。

27
Lucas

PHP 7.3は、配列の最初と最後のキーを取得するための2つの関数を追加しました直接元の配列を変更せずに一時オブジェクトの作成:

意味的に意味があることは別として、これらの関数は配列ポインタを移動しません(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) ];
26
Alex Shesterov

いくつかの配列はlistresetまたは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;
}
22
Lee Benson

簡単に

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

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;
}



記録のために、これは もう一つの答え の、配列の最後の要素です。

12
Gras Double

私はecho current($array)をするでしょう。 

11
user1485518
$myArray = array (4 => 'Apple', 7 => 'orange', 13 => 'Plum');
$arrayKeys = array_keys($myArray);

// the first element of your array is:
echo $myArray[$arrayKeys[0]];  
10
Jacob Topping
$array=array( 4 => 'Apple', 7 => 'orange', 13 => 'Plum' );

$firstValue = each($array)[1];

array_values()関数は配列全体をコピーしないため、これはeach()よりはるかに効率的です。

詳細は http://www.php.net/manual/en/function.each.php を参照

9
rustyx
$arr = array( 4 => 'Apple', 7 => 'orange', 13 => 'Plum' );
foreach($arr as $first) break;
echo $first;

出力:

Apple
9
tekin

くだらない方法は:

$foo = array( 4 => 'Apple', 7 => 'orange', 13 => 'Plum' );

function get_first ($foo) {
    foreach ($foo as $k=>$v){
        return $v;
    }
}

print get_first($foo);
8

これらの作業の大部分!ただし、単一行(低リソース)の迅速な呼び出しには:

$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

7
tfont

最初の要素を取得する:

array_values($arr)[0]

最後の要素を取得

array_reverse($arr)[0]
6
Adobe

これを単純にしてください。ここにたくさんの正しい答えがありますが、混乱を最小限にするためです。これら二つは働き、たくさんのオーバーヘッドを減らします。

key($array) =は配列の最初のキーを取得します
current($array) =は配列の最初の値を取得します

5
tfont

つかいます:

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

デフォルトでは、array_sliceはキーを保存しないので、インデックスとして安全にゼロを使用できます。

4
Bazi

これはゲームには少し遅れていますが、私は私の配列がその中に子として配列要素を含んでいるという問題を抱えていたので、最初の配列要素の文字列表現を得ることができませんでした。 によって、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...
?>

私がこの答えを得るのを助けたすべての現在の解決策のおかげで、私はこれがいつか誰かに役立つことを願っています!

4
Chris Kempen

あなたのための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]];
4
Jens A. Koch

ここでは array_values を使用するのが最善の策です。その関数の結果からインデックス0の値を返して「Apple」を取得できます。

4
jmking

これは現実の世界ではそれほど単純な対応ではありません。私たちはあなたがいくつかの図書館で見つけることができる可能性のある応答のこの例を持っていることを後悔します。 

$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より速い

2
Steven Koch

徹底的なチェックはコストがかかり、常に必要というわけではないので、これを行っている状況を覚えておく価値もあります。

例えば、この解決法は私が使用している状況ではうまくいきます(しかし明らかにすべての場合に頼ることはできません...)

 /**
 * 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
Dan King

とにかく昔の記事ですが…作者は、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連想型 配列で動作します。

1
dmikam

これを試して:

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

1

Sarfrazが投稿した内容に少し変更があります

$array = array(1, 2, 3, 4, 5);
$output = array_slice($array, 0, 1);
print_r ($output);
1
Jan Detlefsen

私は配列の内部ポインタをいじるのは好きではありませんが、array_keys()array_values()を使って2番目の配列を作るのも非効率的ですので、私は通常これを定義します:

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

私は "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())));
1
Warbo

ArrayIteratorクラスの使用を提案した人はいません。

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

参照によるOPの規定を回避します。

0
pgee70

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

最初のメソッドでは、最初の要素だけでなく、連想配列をインデックス付き配列のように扱うことができます。

0
Ataboy Josef

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
0
Nabil Kadimi

このコーディングを使って最初の要素を取得できます

$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;
0