web-dev-qa-db-de.com

Wie indizieren Sie ein Array in PHP neu?

Ich habe das folgende Array, das ich gerne neu indexieren möchte, damit die Schlüssel vertauscht werden (idealerweise beginnend bei 1):

Aktuelles Array ( edit: Das Array sieht tatsächlich so aus):

Array (

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

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

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

)

Wie es sein sollte:

Array (

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

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

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

)
127
meleyal

Wenn Sie den Start auf Null zurückstellen möchten, gehen Sie einfach wie folgt vor:

$iZero = array_values($arr);

Wenn Sie es bei einem Start benötigen, verwenden Sie Folgendes:

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

Hier sind die Handbuchseiten für die verwendeten Funktionen:

375
Andrew Moore

Hier ist der beste Weg :

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

das kehrt zurück

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

auf diese Weise

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

du bekommst das

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

Erklärung

array_values(): Gibt die Werte des Eingabearrays und der Indizes numerisch zurück.

array_filter(): Filtert die Elemente eines Arrays mit einer benutzerdefinierten Funktion (UDF Wenn keine angegeben ist , Alle Einträge in der Eingabetabelle mit dem Wert FALSE werden gelöscht .)

51
Sandra

Ich habe gerade herausgefunden, dass Sie auch eine machen können

array_splice($ar, 0, 0);

Dadurch wird die Neuindizierung in situ durchgeführt, sodass Sie keine Kopie des ursprünglichen Arrays erhalten.

8
imagiro

Warum neu indexieren? Einfach 1 zum Index hinzufügen:

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

Edit Nachdem die Frage geklärt wurde: Sie könnten den Index mit dem array_values bei 0 zurücksetzen. Dann könnten Sie den obigen Algorithmus verwenden, wenn Sie möchten, dass gedruckte Elemente bei 1 beginnen.

8
Gumbo

Nun, ich würde gerne denken, dass Sie das Array für Ihr Endziel nicht wirklich auf 1-basiert und nicht auf 0-basiert ändern müssen, sondern es zu der Iterationszeit wie von Gumbo gepostet behandeln könnte.

Jedoch , um Ihre Frage zu beantworten, sollte diese Funktion jedes Array in eine 1-basierte Version konvertieren

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

BEARBEITEN

Hier ist eine wiederverwendbare/flexible Funktion, falls Sie dies wünschen

$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

Sie können ein Array neu indizieren, sodass das neue Array mit einem Index von 1 wie diesem beginnt.

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

Die Ausgabe von oben ist;

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

Dies wird tun, was Sie wollen:

<?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

Eine elegantere Lösung:

$list = array_combine(range(1, count($list)), array_values($list));

5
Ionuţ Pleşca

Ähnlich wie bei @monowerker musste ich ein Array mithilfe des Schlüssels eines Objekts neu indizieren.

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

Dies führte zu:

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

Möglicherweise möchten Sie überlegen, warum Sie überhaupt ein 1-basiertes Array verwenden möchten. Nullbasierte Arrays (wenn nicht-assoziative Arrays verwendet werden) sind ziemlich Standard, und wenn Sie die Ausgabe an eine Benutzeroberfläche vornehmen möchten, können die meisten die Lösung durch einfaches Erhöhen der Ganzzahl bei der Ausgabe an die Benutzeroberfläche behandeln.

Denken Sie an Konsistenz - sowohl in Ihrer Anwendung als auch in dem Code, mit dem Sie arbeiten -, wenn Sie über 1-basierte Indexer für Arrays nachdenken.

4
Michael Trausch

Wenn Sie nicht versuchen, das Array neu zu ordnen, können Sie Folgendes tun:

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

Das array_reverse ist sehr schnell und ordnet sich neu, wenn es umgekehrt wird. Jemand anderes hat mir das vor langer Zeit gezeigt. Ich kann es mir nicht anrechnen, dass ich es mir ausgedacht habe. Aber es ist sehr einfach und schnell.

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

doppelte Entfernung und erneute Indexierung eines Arrays:

<?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

Hier ist meine eigene Implementierung. Schlüssel im Eingabefeld werden mit inkrementierenden Schlüsseln ab $ start_index neu nummeriert.

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

Das Sortieren ist nur ein sort () , die Neuindizierung erscheint ein bisschen dumm, aber wenn es nötig ist, wird es das tun. Obwohl nicht vor Ort. Verwenden Sie array_walk () Wenn Sie dies an mehreren Stellen tun, verwenden Sie einfach eine for-key-value-Schleife, falls dies eine einmalige Operation ist.

<?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

Ähnlich wie bei Nicks Beitrag kam ich zu der gleichen Lösung für die Neuindizierung eines Arrays, verbesserte jedoch die Funktion ein wenig, da ab PHP Version 5.4 es nicht funktioniert, weil Variablen durch Verweis übergeben werden. Die Neuindizierungsfunktion für ein Beispiel lautet dann wie folgt: use Schlüsselwortschließung:

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

Einfach das tun:

<?php

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

Sie können dies problemlos tun, nachdem Sie die Funktionen array_values ​​() und array_filter () zusammen verwendet haben, um leere Array-Elemente zu entfernen und aus einem Array in PHP neu zu indizieren.

array_filter () - Funktion Die Funktion PHP array_filter () entfernt leere Array-Elemente oder Werte aus einem Array in PHP. Dadurch werden auch leere, null, falsche und 0 (null) Werte entfernt.

array_values ​​() - Funktion Die Funktion PHP array_values ​​() gibt ein Array zurück, das alle Werte eines Arrays enthält. Das zurückgegebene Array enthält numerische Schlüssel, beginnend bei 0 und um 1 erhöht.

Leere Array-Elemente entfernen und neu indexieren

Zuerst sehen wir uns die Ausgabe des $ stack-Arrays an:

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

Ausgabe:

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

In der obigen Ausgabe möchten wir leere, null und null Werte entfernen und dann Arrayelemente neu indizieren. Jetzt werden wir die Funktion array_values ​​() und array_filter () zusammen verwenden, wie im folgenden Beispiel:

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

Ausgabe:

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