2017-07-15 5 views
1

Ich habe dieses mehrdimensionale Array:ein Element eines Arrays von Anfang bis Ende

$array48= array(
array("2017-06-30-104",1498858541000,39.3322,-122.9027,2.11,0,"U",36) 
); 

OUTPUT:

Array ( 
    [0] => Array ( 
       [0] => 2017-06-30-104 
       [1] => 1498858541000 
       [2] => 39.3322 
       [3] => -122.9027 
       [4] => 2.11 
       [5] => 0 
       [6] => U 
       [7] => 36      
       ) 
    ) 

ich will $array48[0][0] bis zum Ende bewegen, und ich tue dies:

function id_fine($array_disordinato){ 
    $number= count($array_disordinato); 
    for($a= 0; $a < $number; $a++){ 
     $element= $array_disordinato[$a][0]; 

     unset($array_disordinato[$a][0]); 
     array_push($array_disordinato[$a],$element); 
    } 
    return $array_disordinato; 
} 

id_fine($array48); 

funktioniert, aber ich verstehe nicht, warum die Ausgabe lautet:

Array ( 
    [0] => Array ( 
       [1] => 1498858541000 
       [2] => 39.3322 
       [3] => -122.9027 
       [4] => 2.11 
       [5] => 0 
       [6] => U 
       [7] => 36 
       [8] => 2017-06-30-104 
       ) 
    ) 

Die Position jedes Elements ist falsch. Es sollte sein:

Array ( 
    [0] => Array (      
       [0] => 1498858541000 
       [1] => 39.3322 
       [2] => -122.9027 
       [3] => 2.11 
       [4] => 0 
       [5] => U 
       [6] => 36 
       [7] => 2017-06-30-104      
       ) 
    ) 
+0

Die Schlüssel in einem numerisch Index Array persistent sind ebenso in einem assoziativen Array. Wenn Sie einen löschen, ist er weg, bis er erneut gesetzt wird. Wenn Sie ein _dynamisch_ indiziertes Array wünschen, schauen Sie sich die Funktion 'array_values ​​()' an. – arkascha

+0

Sie 'unset ($ array_disordinato [$ a] [0]); ', erinnern Sie sich? ['unset()'] (http://php.net/manual/en/function.unset.php) entfernt nur den Wert, es indiziert das Array nicht neu; Es weiß nicht einmal, dass der Wert, den Sie in einem Array angeben wollten, nicht gesetzt war, und es wäre auch egal, weil es nicht seine Aufgabe ist, sich um Arrays zu kümmern. ['array_push()'] (http://php.net/manual/en/function.array-push.php) führt auch keine Neuindizierung des Arrays durch. Es findet nur den größten numerischen Schlüssel, inkrementiert ihn und speichert den Wert dort. – axiac

Antwort

2

Innerhalb Ihrer id_fine Funktion die Array-Werte Ihrer Array zurückgesetzt array_values

$array_disordinato[0] = array_values($array_disordinato[0]); 
return $array_disordinato 
1

Sie verwenden immer dieses Ergebnis, weil Sie die Position (unset($array_disordinato[$a][0]);) deshalb diese Position nicht mehr unset existiert ; Was Sie tun möchten, ist ein komplett neues Array mit den neuen Ergebnissen zu erstellen.

Durch die Nutzung, was Sie haben, wird der bloiw Code zeigen Ihnen, wie das Problem zu beheben:

$array48= array(
array("2017-06-30-104",1498858541000,39.3322,-122.9027,2.11,0,"U",36) 
); 

function id_fine($array_disordinato) { 
    $number = count ($array_disordinato); 

    for($a= 0; $a < $number; $a++) { 
     $element = $array_disordinato [$a][0]; 

     unset($array_disordinato[$a][0]); 

     // HERE: after you unset the array you want to re-order back so it starts from 0 
     // with this line only you should be fine :) 
     $array_disordinato[$a] = array_values ($array_disordinato[$a]); 

     array_push($array_disordinato[$a],$element); 
    } 

    return $array_disordinato; 
} 

var_dump (id_fine($array48)); 
4

Ich würde vorschlagen, Sie array_shift verwenden zum Bewegen Ihrer ersten bis zum letzten:

array_push($array48[0], array_shift($array48[0])); 

DEMO

oder -nutzung:

$array48[0][]= array_shift($array48[0]); 

Danke Andreas für einen Kommentar!

Einzel Liner tun würde, was Sie wollen:

Array 
(
    [0] => Array 
     (
      [0] => 1498858541000 
      [1] => 39.3322 
      [2] => -122.9027 
      [3] => 2.11 
      [4] => 0 
      [5] => U 
      [6] => 36 
      [7] => 2017-06-30-104 
     ) 

) 

So, keine Notwendigkeit der komplexen Funktion id_fine mit unset und dann array_values


Von DOCS:

array_shift() verschiebt den ersten Wert des Arrays und gibt es zurück, verkürzt das Array um ein Element und verschiebt alles nach unten. Alle numerischen Array-Tasten werden so geändert, dass sie von Null zu zählen beginnen, während die Buchstabentasten nicht berührt werden.

+1

Keine Notwendigkeit für array_push entweder $ array48 [0] [] = array_shift ($ array48 [0]); 'https://3v4l.org/CbcDT – Andreas

+1

Yeah oder so :) – Thamilan

1

unset($array_disordinato[$a][0]); entfernt nur den Wert, es indiziert das Array nicht neu.Es kennt nicht einmal den Wert, den Sie in einem Array angeben wollten, und es wäre mir egal, weil es nicht seine Aufgabe ist, sich um Arrays zu kümmern.

array_push($array_disordinato[$a],$element) auch nicht das Array neu indizieren. Es findet nur den größten numerischen Schlüssel, inkrementiert ihn und speichert den Wert dort.

Es gibt mehrere Möglichkeiten, Ihr Ziel zu erreichen. Eine davon ist die Verwendung von array_values(), nachdem Sie die Werte neu sortiert haben. array_values() ignoriert die vorhandenen Array-Schlüssel; Es ruft nur die Werte ab und erzeugt neue Indizes ab 0.

Eine andere Option ist die Verwendung von array_slice() anstelle von unset(). Es extrahiert ein Segment aus dem Array (Sie benötigen vom Index 1 bis zum Ende) und das Array, das es zurückgibt, wird standardmäßig neu indiziert. Sie können dann mit array_push() oder [] nur den Wert anhängen Sie bereits in $element gespeichert:

function id_fine(array $array_disordinato) 
{ 
    // Use the array keys to iterate over the array; it is safer 
    foreach (array_keys($array_disortinato) as $a) { 
     // Copy the first element to the end 
     $array_disordinato[$a][] = $array_disordinato[$a][0]; 
     // Ignore the first element 
     $array_disordinato[$a] = array_slice($array_disordinato[$a], 1); 
    } 

    return $array_disordinato; 
} 
Verwandte Themen