# Element aus Array löschen und Array neu indexieren



## curana (1. Mai 2005)

Hallo.
Ich hab ein Problem:

Auf der Artikel-Anzeige-Seite meines "Shopsystems" wird mit folgendem Befehl die Artikel ID aus der Datenbank und die zugehörige Bestellmenge in einem Array gespeichert:


```
if(($_GET['add2cart'] == "set") && ($_POST[shart] != "") && ($_POST[shanzahl] != ""))
  {
    $_SESSION['warenkorb'][]=array($_POST[shart], $_POST[shanzahl]);
  }
```

Soweit so gut. Jetzt will ich den Warenkorb anzeigen, das funktioniert wie folgt:


```
echo <<<PRINT_TABLE
                        <tr{$bg_color}>
                          <td width="25" valign="top"><font face="Verdana, Arial, Helvetica, sans-serif" size="2">{$j}</font></td>
                          <td><a href="shop_artikelview.php?kat_id={$kat}&sub_id={$sub}&art={$_SESSION['warenkorb'][$n][0]}&PHPSESSID={$PHPSESSID}"><font face="Verdana, Arial, Helvetica, sans-serif" size="2" color="#000000">{$select_array['art_name']} (Art. {$select_array['art_nr']})</font></a></td>
                          <td align="center"><input type="text" size="1" name="count[]" value="{$_SESSION['warenkorb'][$n][1]}"></td>
                          <td align="right"><font face="Verdana, Arial, Helvetica, sans-serif" size="2" color="#000000">{$select_array['art_price']} &euro;</font></td>
                          <td align="right"><font face="Verdana, Arial, Helvetica, sans-serif" size="2" color="#000000">{$price} &euro;</font></td>
                        </tr>
PRINT_TABLE;
```

Nun will ich es erreichen, dass wenn jemand als Artikelmenge "0" eingibt, der Artikel aus dem Array gelöscht wird und der Index neu gesetzt wird, damit ich direkt auf ein Element zugreifen kann.
Bisher ist das wie folgt gelöst:


```
if($_POST['action'] == "Aktualisieren")
  {
    $xi = count($_SESSION['warenkorb'])-1;

    for ($h=0; $h<=$xi; $h++)
      {
        if($count[$h] == "0")
          {
            unset($_SESSION['warenkorb'][$h][0]);
            unset($_SESSION['warenkorb'][$h][1]);
            $_SESSION['warenkorb'] = (array_values($_SESSION['warenkorb']));
          }
      }
  }
```

Aber das funktioniert nicht. Er löscht zwar irgendwie das Element, aber er lässt sozusagen einen leeren Platz drin. Dadurch ergibt die Zählung der Array-Elemente genauso viele wie vorher, auch wenn praktisch nur ein Leerzeichen ausgegeben wird.
Versteht ihr was ich meine? Ich hatte gedacht, dass die Funktion 
	
	
	



```
array_values($array)
```
 dies für mich regelt.

Habt ihr nen TIpp für mich? Vielen Dank schonmal


----------



## DerBo (4. März 2009)

Hallo,
ich habe das gleiche Problem, bzw es ist von ähnlicher Natur. Ich habe ein Array


```
$_SESSION["testarray"] = array();
...
testarray[] = $zahl; // $zahl wird jedes mal neu erstellt und im array angefügt
...
```
^^das klappt schonmal super. Wenn ich aber nun ein bestimmtest Element löschen möchte bekomme ich probleme. Ich habe bereits auch schon nach gegoogelt und habe 2 möglichkeiten gefunden, die bringen aber beide nicht das gewünschte Ergebnis
1. Methode: Position des Elements im Array finden, Position übergeben und Element an der Position löschen.

```
$position=array_search($zahl,$testarray);
unset($testarray[$position]);
```
=> Das Problem hierbei ist, das er mir immer 2 Elemente nach einem unrationalem Schema löscht. Hierbei muss ich aber noch sagen, das ich vor dem hinzufügen im Array überprüfe ob der Wert bereits enthalten ist, wenn ja speicher ich den nicht nochmal ab.
Komisch ist auch, das das Array nach dem "unset" anscheinend die Variable noch unsichtbar im Array behält und dann nach ein paar mal "Löschen" erst richtig löscht.

2. Methode: Einfach das Element an der Position löschen

```
unset($testarray[$zahl]);
```
=> Das Problem hierbei ist, das er gar nichts löscht. Weder wenn ich normale Zahlen (Integer) oder Buchstaben & Zahlen (String) übergebe. Wobei ich bei dieser Methode und den Zahlen Werten zugeben muss, das er dann die Position nimmt und nicht das Element... 

Wäre super wenn mir da jemand helfen könnte. Sitze da schon eine Weile dran.


----------



## xanthos (4. März 2009)

@curana

unset($_SESSION['warenkorb'][$h]);

anstatt

unset($_SESSION['warenkorb'][$h][0]);
unset($_SESSION['warenkorb'][$h][1]);

Der Rest stimmt.


----------



## kuddeldaddeldu (4. März 2009)

Hi,



xanthos hat gesagt.:


> @curana



ich bezweifele ehrlich gesagt, dass curana das noch lesen wird...

@DerBo: Ich kann Dein Problem absolut nicht nachvollziehen:


```
$array = array(23, 567, 423, 34);
print_r($array);
$position = array_search(567, $array);
unset($array[$position]);
print_r($array);
$array = array_values($array);
print_r($array);
```

liefert erwartungsgemäß:


```
Array
(
    [0] => 23
    [1] => 567
    [2] => 423
    [3] => 34
)
Array
(
    [0] => 23
    [2] => 423
    [3] => 34
)
Array
(
    [0] => 23
    [1] => 423
    [2] => 34
)
```

Lass Dir das Array und die gefundene Position mal testhalber ausgeben.

LG


----------



## DerBo (4. März 2009)

yeah 
Danke kuddeldaddeldu 
array_values(); war der Zauber befehl. Nun klappt es bei mir. Kannte die Funktion bisher nicht.


----------



## xanthos (4. März 2009)

kuddeldaddeldu hat gesagt.:


> ich bezweifele ehrlich gesagt, dass curana das noch lesen wird...



Das bezweifle ich auch, nachdem ich nun das Datum lese...


----------



## DerBo (4. März 2009)

lol, seh ich auch grade mal 
Ich hab den Beitrag per Google gefunden und dann mal geschrieben.


----------



## DerBo (5. März 2009)

Hey,
ich muss euch nochmal mit einem veränderten Problem nerven 
Ich habe nun ein Mehrdimensionales Assoziatives Array, welches so in der Form aufgebaut ist:

```
$meinarray[] = array("vorname" => $name,
                                        "nachname" => $adresse );
$meinarray[] = array("vorname" => $name,
                                        "nachname" => $adresse );
....
```
Es wird immer ein neues Array angehängt. Bestimmte Einträge ausgeben ist ja auch einfach:

```
echo "Vorname: ".$meinarray[0]["vorname"];
echo " Nachname: ".$meinarray[0]["nachname"];
```
Nun habe ich aber ein Problem
Ich möchte schauen ob ein Wert in meinem Array enthalten ist:

```
if(in_array($vorname,$meinarray[?][?]{ ...
```
Wie verfahre ich denn da? Bin ich gezwungen mit einer foreach Schleife durch das gesamte Array zu gehen und nach dem Namen zu suchen, oder geht das auch irgendwie mit der in_array Funktion, oder gibt es gar eine noch bessere und einfachere Lösung?

Ich wäre sehr dankbar für Hilfe


----------



## xanthos (5. März 2009)

Wieso immer so umständlich? 


```
<?php
  $mainarray['vorname'][] = $name;
  $mainarray['nachname'][] = $adresse;
  
  if($key = array_search($name,$mainarray['vorname'])) echo 'Vorname: '.$mainarray['vorname'][$key].', '.
                                                            'Nachname: '.$mainarray['nachname'][$key];
  else echo 'Name nicht gefunden!';
?>
```


----------



## DerBo (5. März 2009)

Ich habe das grade versucht. array_search gibt mir ja den Wert an der Stelle zurück, wo er den String findet, den brauch ich aber gar nicht, so habe ich grade mal nach einer alternative zu deiner Lösung gesucht. Ich bin auch fündig geworden.Nun macht er das auch richtig, das Problem ist nun nur noch die überprüfung auf Groß- und Kleinschreibung, das macht er nicht richtig

```
if(!in_array(array("linkname" => $mylinkname,"linkadresse" => $mylinkadresse),$eigenelinks) )
{  //machwas } else { //maxhnix}
```
^^Ansonsten funktioniert das  Danke aber trotzdem @xanthos


----------

