配列要素を削除してから配列のインデックスを再作成する方法は?


206

アレイに問題があります。以下のように変更したい配列が1つあります。その要素(要素)をインデックスで削除してから、配列のインデックスを再作成したいと思います。出来ますか?

$foo = array(

    'whatever', // [0]
    'foo', // [1]
    'bar' // [2]

);

$foo2 = array(

    'foo', // [0], before [1]
    'bar' // [1], before [2]

);

回答:


456
unset($foo[0]); // remove item at index 0
$foo2 = array_values($foo); // 'reindex' array

6
これはまさに私が投稿したかった+1です。
Michiel Pater

4
複数のアイテムを一度に削除する必要がある場合-それらのアイテムのインデックスが事前に収集されている場合、これはdecezeのソリューションよりも優れています。最初のアイテムでarray_spliceを使用すると、残りのアイテムのインデックスが失われます。
ジャニスElmeris

23
それは価値があるあなたは、単一の未設定の呼び出しで複数の変数/配列インデックスの設定を解除することができますことは注目かもしれunset($foo[0], $foo[3], $bar[1]);
ᴍᴀᴛᴛʙᴀᴋᴇʀ

非常に素晴らしいソリューション仲間:)
Michael Kisilenko 2014

私はこれを使いました。ありがとうございました。を使用array_spliceしていて、0番目と1番目のインデックスでは機能しませんでした。
theGreenCabbage 2015


29

あなたはよりよく使うarray_shift()。これは、配列の最初の要素を返し、それを配列から削除し、配列のインデックスを再作成します。オールインワンの効率的な方法。


2
これは、最初の配列要素を取得してから削除し、プロセスで配列のインデックスを再作成する場合に問題ありません。対応する関数array_pop()は、必要に応じて最後の配列要素を取得して削除します。ただし、どちらの関数も、配列の中央にある要素に作用させることはできません。
デリックミラー

1
これは直交関係にありますが、問題は、最初のものだけでなく、配列の任意の要素に関するものです。
フェリックス・ガニオン-グルニエ


9
Unset($array[0]); 

Sort($array); 

なぜこれが反対票を投じられているのかはわかりませんが、誰かがそれを試してみたくなったら、それが機能することに気付くでしょう。配列でソートを使用すると、配列のキーが再割り当てされます。唯一の欠点は、値を並べ替えることです。キーが明らかに再割り当てされるため、を使用してもarray_values、値がソートされているかどうかは問題ではありません。


9
キーが再割り当てされる場合でも、正解では最初の順序が保持されます。
s3v3n

1
「その要素(要素)をインデックスで削除してから、配列のインデックスを再作成したいのですが、可能ですか?」@ s3v3n OPは最初の順序の維持を要求しませんでした。私は機能し、記載されていることを実行するソリューションを提供しました。
凍るような素晴らしい

1
質問は2歳です。手放す!
s3v3n 2014

@ s3v3n恨みではありません。その理由を知りたいだけです。明らかに後の答えを改善するために。より良い方法があることに同意しますが、この答えがそれほど悪い理由はありますか?性能ですか?等?私がSOにいるのと同じ理由で、学ぶだけでなく教えることも。
凍るような驚異的な

通常の状況下では、プログラマーが入力とまったく同じ順序でこれらの値を必要とする可能性が非常に高いです。例として、テーブルに表示する必要があるデータベースのいくつかの行を見てみましょう。または、返信がまったく同じ順序になるはずのチャットアプリケーション。例の数は無限である可能性があります。ポイントは、ほとんどの場合、順序が同じである必要があるか、少なくともプログラマーが配列内の要素の同じ順序を期待することです。
s3v3n 2014

4

試してみてください:

$foo2 = array_slice($foo, 1);

これは最初の要素でのみ機能し、任意の要素では機能しません。
Felix Kling、2011年

0

xzyferの答えに加えて

関数

function custom_unset(&$array=array(), $key=0) {
    if(isset($array[$key])){

        // remove item at index
        unset($array[$key]);

        // 'reindex' array
        $array = array_values($array);

        //alternatively
        //$array = array_merge($array); 

    }
    return $array;
}

使用する

$my_array=array(
    0=>'test0', 
    1=>'test1', 
    2=>'test2'
);

custom_unset($my_array, 1);

結果

 array(2) {
    [0]=>
    string(5) "test0"
    [1]=>
    string(5) "test2"
  }

0

を使用するarray_mergeと、キーのインデックスが再作成されます。マニュアルはこう述べています:

数値キーのある入力配列の値は、結果配列のゼロから始まる増分キーで番号が付け直されます。

http://php.net/manual/en/function.array-merge.php

これは私が元の答えを見つけた場所です。

http://board.phpbuilder.com/showthread.php?10299961-Reset-index-on-array-after-unset()

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.