web-dev-qa-db-ja.com

PHPで配列のインデックスを再作成するにはどうすればよいですか?

次の配列があり、キーの順序が逆になるようにインデックスを再作成します(理想的には1から始まります)。

現在の配列(edit:配列は実際には次のようになります):

Array (

[2] => Object
    (
        [title] => Section
        [linked] => 1
    )

[1] => Object
    (
        [title] => Sub-Section
        [linked] => 1
    )

[0] => Object
    (
        [title] => Sub-Sub-Section
        [linked] => 
    )

)

どうするべき:

Array (

[1] => Object
    (
        [title] => Section
        [linked] => 1
    )

[2] => Object
    (
        [title] => Sub-Section
        [linked] => 1
    )

[3] => Object
    (
        [title] => Sub-Sub-Section
        [linked] => 
    )

)
135
meleyal

ゼロからインデックスを再作成する場合は、次の手順を実行します。

$iZero = array_values($arr);

1から開始する必要がある場合は、次を使用します。

$iOne = array_combine(range(1, count($arr)), array_values($arr));

使用される機能のマニュアルページは次のとおりです。

394
Andrew Moore

これが最良の方法です

# Array
$array = array('tomato', '', 'Apple', 'melon', 'cherry', '', '', 'banana');

それは返す

Array
(
    [0] => tomato
    [1] => 
    [2] => Apple
    [3] => melon
    [4] => cherry
    [5] => 
    [6] => 
    [7] => banana
)

これを行うことにより

$array = array_values(array_filter($array));

あなたはこれを得る

Array
(
    [0] => tomato
    [1] => Apple
    [2] => melon
    [3] => cherry
    [4] => banana
)

説明

array_values():入力配列の値とインデックスを数値で返します。

array_filter():ユーザー定義関数で配列の要素をフィルタリングします(UDF 提供されない場合FALSEの値を持つ入力テーブルのすべてのエントリが削除されます

53
Sandra

私もあなたができることを知りました

array_splice($ar, 0, 0);

インデックスの再作成はインプレースで行われるため、元の配列のコピーで終わることはありません。

9
imagiro

インデックスを再作成する理由インデックスに1を追加するだけです。

foreach ($array as $key => $val) {
    echo $key + 1, '<br>';
}

編集質問が明確になった後:array_valuesを使用して、0から始まるインデックスをリセットできます。印刷された要素を1から開始する場合は、上記のアルゴリズムを使用できます。

8
Gumbo

さて、あなたの最終目標が何であれ、実際には配列を0ベースではなく1ベースに変更する必要はなく、代わりにGumboが投稿したように反復時に処理できると思います。

ただし、質問に答えるために、この関数は任意の配列を1ベースのバージョンに変換する必要があります

function convertToOneBased( $arr )
{
    return array_combine( range( 1, count( $arr ) ), array_values( $arr ) );
}

編集

より再利用可能/柔軟な機能をご希望の場合は、こちらをご覧ください

$arr = array( 'a', 'b', 'c' );

echo '<pre>';
print_r( reIndexArray( $arr ) );
print_r( reIndexArray( $arr, 1 ) );
print_r( reIndexArray( $arr, 2 ) );
print_r( reIndexArray( $arr, 10 ) );
print_r( reIndexArray( $arr, -10 ) );
echo '</pre>';

function reIndexArray( $arr, $startAt=0 )
{
    return ( 0 == $startAt )
        ? array_values( $arr )
        : array_combine( range( $startAt, count( $arr ) + ( $startAt - 1 ) ), array_values( $arr ) );
}
6
Peter Bailey

新しい配列が次のように1のインデックスで始まるように、配列のインデックスを再作成できます。

$arr = array(
  '2' => 'red',
  '1' => 'green',
  '0' => 'blue',
);

$arr1 = array_values($arr);   // Reindex the array starting from 0.
array_unshift($arr1, '');     // Prepend a dummy element to the start of the array.
unset($arr1[0]);              // Kill the dummy element.

print_r($arr);
print_r($arr1);

上記の出力は次のとおりです。

Array
(
    [2] => red
    [1] => green
    [0] => blue
)
Array
(
    [1] => red
    [2] => green
    [3] => blue
)
5
Nigel Alderton

これはあなたが望むことをします:

<?php

$array = array(2 => 'a', 1 => 'b', 0 => 'c');

array_unshift($array, false); // Add to the start of the array
$array = array_values($array); // Re-number

// Remove the first index so we start at 1
$array = array_slice($array, 1, count($array), true);

print_r($array); // Array ( [1] => a [2] => b [3] => c ) 

?>
5
Greg

よりエレガントなソリューション:


$list = array_combine(range(1, count($list)), array_values($list));
5
Ionuţ Pleşca

@monowerkerと同様に、オブジェクトのキーを使用して配列のインデックスを再作成する必要がありました...

$new = array();
$old = array(
  (object)array('id' => 123),
  (object)array('id' => 456),
  (object)array('id' => 789),
);
print_r($old);

array_walk($old, function($item, $key, &$reindexed_array) {
  $reindexed_array[$item->id] = $item;
}, &$new);

print_r($new);

その結果、次のようになりました。

Array
(
    [0] => stdClass Object
        (
            [id] => 123
        )
    [1] => stdClass Object
        (
            [id] => 456
        )
    [2] => stdClass Object
        (
            [id] => 789
        )
)
Array
(
    [123] => stdClass Object
        (
            [id] => 123
        )
    [456] => stdClass Object
        (
            [id] => 456
        )
    [789] => stdClass Object
        (
            [id] => 789
        )
)
4
Nick

1ベースの配列を使用する理由を検討することをお勧めします。ゼロベースの配列(非連想配列を使用する場合)は非常に標準的なものであり、UIに出力する場合、ほとんどの場合、UIへの出力時に整数を増やすことでソリューションを処理します。

配列の1ベースのインデクサーを検討するときは、アプリケーションと使用するコードの両方で一貫性を考慮してください。

4
Michael Trausch

配列の順序を変更しようとしていない場合は、次を実行できます。

$ array = array_reverse($ array);
$ array = array_reverse($ array);

Array_reverseは非常に高速で、逆順に並べ替えます。他の誰かがずっと前にこれを見せてくれました。だから私はそれを考え出すための信用を取ることはできません。しかし、それは非常にシンプルで高速です。

3
Mark
$tmp = array();
foreach (array_values($array) as $key => $value) {
    $tmp[$key+1] = $value;
}
$array = $tmp;
3
Tom Haigh

重複した削除と配列の再インデックス化:

<?php  
   $oldArray = array('0'=>'php','1'=>'Java','2'=>'','3'=>'asp','4'=>'','5'=>'mysql');
   //duplicate removal
   $fillteredArray = array_filter($oldArray);
   //reindexing actually happens  here
   $newArray = array_merge($filteredArray);
   print_r($newArray);
?>
2
Sam T

これが私自身の実装です。入力配列内のキーは、$ start_indexから始まるキーで番号が付け直されます。

function array_reindex($array, $start_index)
{
    $array = array_values($array);
    $zeros_array = array_fill(0, $start_index, null);
    return array_slice(array_merge($zeros_array, $array), $start_index, null, true);
}
1
Mustapha Hadid

これを行うだけです:

<?php

array_Push($array, '');
$array = array_reverse($array);
array_shift($array);
1
Roham Rafii

ソートは単なる sort() であり、インデックスの再作成は少しばかげているように見えますが、必要な場合はこれで実行できます。インプレースではありませんが。多数の場所でこれを行う場合は array_walk() を使用します。これが1回限りの操作である場合は、for-key-valueループを使用します。

<?php

function reindex(&$item, $key, &$reindexedarr) {
    $reindexedarr[$key+1] = $item;
}

$arr = Array (2 => 'c', 1 => 'b', 0 => 'a');

sort($arr);
$newarr = Array();
array_walk($arr, reindex, &$newarr);
$arr = $newarr;
print_r($arr); // Array ( [1] => a [2] => b [3] => c )

?>
1
monowerker

ニックの貢献と同様に、配列のインデックスを再作成するために同じソリューションに行きましたが、PHPバージョン5.4から関数を少し拡張しました。変数を参照渡しするため機能しません。 useキーワードクロージャを使用したインデックス再作成関数の例は次のようになります。

function indexArrayByElement($array, $element)
{
    $arrayReindexed = [];
    array_walk(
        $array,
        function ($item, $key) use (&$arrayReindexed, $element) {
            $arrayReindexed[$item[$element]] = $item;
        }
    );
    return $arrayReindexed;
}
1
FantomX1

Array_values()およびarray_filter()関数を一緒に使用して空の配列要素を削除し、PHPの配列からインデックスを再作成した後、簡単に実行できます。

array_filter()関数PHP array_filter()関数は、配列から空の配列要素または値を削除しますPHPで。これにより、空白、null、false、0(ゼロ)値も削除されます。

array_values()関数PHP array_values()関数は、すべての値を含む配列を返しますアレイ。返される配列には、0から始まり1ずつ増加する数値キーがあります。

空の配列要素を削除してインデックスを再作成する

まず、$ stack配列の出力を見てみましょう。

<?php
  $stack = array("PHP", "HTML", "CSS", "", "JavaScript", null, 0);
  print_r($stack);
?>

出力:

Array
(
    [0] => PHP
    [1] => HTML
    [2] => CSS
    [3] => 
    [4] => JavaScript
    [5] => 
    [6] => 0
)

上記の出力では、空白、null、0(ゼロ)値を削除してから、配列要素のインデックスを再作成します。次に、以下の例のようにarray_values()およびarray_filter()関数を一緒に使用します。

<?php
  $stack = array("PHP", "HTML", "CSS", "", "JavaScript", null, 0);
  print_r(array_values(array_filter($stack)));
?>

出力:

Array
(
    [0] => PHP
    [1] => HTML
    [2] => CSS
    [3] => JavaScript
)
1
Star