Kurze unset frage

Morph

Erfahrenes Mitglied
Frage kurz und schmerzlos: Wenn ich z.B. $array[2] per unset lösche, rücken dann die anderen indize nach ? (also $array[3] auf $array[2], $array[4] auf $array[3] usw)

Grüße, Morph
 
Ok, hat sich schon erledigt - habs probiert und es geht nicht.
Hab's dann mit folgendem probiert:
PHP:
// Schematisches Beispiel
<?php

$array[] = "indiez1";
$array[] = "indiez2";
$array[] = "indiez3";
$array[] = "indiez4";

echo "0 = $array[0]<br>";
echo "1 = $array[1]<br>";
echo "2 = $array[2]<br>";
echo "3 = $array[3]<br><br>";

$z1 = 1;
$z2 = 0;
$z3 = 0;
$zges = 4;
$delete = 2;

while ($z1 < $zges) {

	if ($z1 == $delete) {
		$z2 = $z1;
		$z3 = $z1 + 1;

		while ($z3 < $zges) {
			$array[$z2] = $array[$z3];
			$z2++;
			$z3++;
		}

	unset($array[($zges)-1]);
	}

echo $z1-1 ." = " .$array[($z1)-1] ."<br>";
$z1++;
}

?>
Es macht genau das, was ich wollte ;)

Grüße, Morph
 
Kurze Antwort: Nö!

Test this:
PHP:
<?php
$test_array[1] = 1;
$test_array[2] = 1;
$test_array[3] = 1;

echo ("Normale Ausgabe:<br>");
for ($i=1; $i<=3; $i++)
{
	echo ("Feld ".$i.": ");
	echo ($test_array[$i]."<br>");
}
echo ("<br>");

unset ($test_array[1]);

echo ("Nach dem Löschen:<br>");
for ($i=1; $i<=3; $i++)
{
	echo ("Feld ".$i.": ");
	echo ($test_array[$i]."<br>");
}
echo ("<br>");
?>

Edit: Da war ich wohl zu spät! ;-)

P.S.: Kannst ja ne eigene lösch funktion schreiben die den index verschiebt wenn du das unbedingt brauchst.
 
Zuletzt bearbeitet:
Das war ne schematische anordnung: $delete wird von ner anderen seite übergeben, $zges wird durch auslesen einer datei ermittelt usw ... ich lösche damit news und schreibe sie dann zurück in die datei - außerdem find ichs so übersichtlicher (und ich versteh deins net :-))

@ TheVirus: ich habe nicht vor den index zu verschieben sondern, wie grad geschildert, einen bestimmten teil aus einer news datei zu löschen und den rest ein indiez "vorzurücken"

Grüße, Morph
 
Ich hätte jetzt ne funktion geschrieben, die das gesamte Array umkopiert in ein anderes nur eben ohne diese besagte stelle, und diesen dann schliesslich returnt.
PHP:
funktion delete_array_element ($delete_id,$array)
{
  $counter = 1;
  if ($delete_id != 1)
  {
    while ($counter < $delete_id)
    {
      $new_array[$counter] = array[$counter];
      $counter++;
    }
    $counter++;
    while (isset($array[$counter]))
    {
      $new_array[$counter] = array[$counter];
      $counter ++;
    }
  }
  else
  {
    while (isset($array[$counter_2]))
    {
      $counter_2 = $counter ++;
      $new_array[$counter] = array[$counter_2];
      $counter ++;
    }
  }
  return $new_array;
}

//Hauptorgramm
$array = delete_array_element (1,$array) //z.b.

So Long
TheVirus

P.S.: 100% untested.... Kann sein dass es nicht löppt.
 
Zuletzt bearbeitet:
Hm wäre auch eine lösung
Aber ist im endeffekt ja wurst ob ich das umkopieren oder einfach die besagte stelle lösche und dann den array zurüchschreibe
Aber danke für dein beispiel :) speicher ich mir auchmal zu meinem, man weis ja nie wann man sowas nochmal brauchst (außer für meine delete function ;))

Grüße, Morph
 
@ TheVirus
Hab dein Post grade nochmal (zufällig) gesehen und hab gemerkt, dass da was net stimmt ... naja wie auch immer, hab den code etwas *modifiziert* ;)
PHP:
<?php
$test_array[1] = 1;
$test_array[2] = 2;
$test_array[3] = 3;
$test_array[4] = 4;

echo ("Normale Ausgabe:<br>");
for ($i=1; $i<=4; $i++)
{
    echo ("Feld ".$i.": ");
    echo ($test_array[$i]."<br>");
}
echo ("<br>");

unset ($test_array[2]);

$a = 1;
$i = 4;
while ($a <= $i) {
	if(isset($test_array[$a])) {
		$new_array[] = $test_array[$a];
	} else {
		$a++;
		$new_array[] = $test_array[$a];
	}
$a++;
}

foreach($new_array as $array)
echo $array."<br>";

?>

Grüße, Morph
 
OUCH!!

So, jetzt hab ich mir mal den code daoben von mir nochmal angeguckt. Ist zum kotzen. Es ist erstaunlich wieviele fehler man in eine einzige Funktion packen kann.

Nun aber die korrigierte, einwandfrei laufende, alle exceptions abfangende, getestete lösch funktion:
PHP:
function delete_array_element ($delete_id,$array)
{
	$counter1 = 1;
	if ($delete_id != 1)
	{
		$counter2 = 1;	
	}
	else
	{
		$counter2 = 2;
		if (!isset ($array[$counter2]))
		{
			die ("Array has only this element");
		}
	}
	while (isset($array[$counter2]))
	{
		if ($counter2 != $delete_id)
		{
			$new_array[$counter1] = $array[$counter2];
			$counter1 ++;
			$counter2++;
		}
		else
		{
			$counter2++;
		}
	}
	return $new_array;
}

So! Die Löppt auch wirklich! ;-)

So Long
TheVirus
 
Hey cool - mir war garnicht aufgefallen, dass in deiner Funktion ein Fehler war %) ok hab' mir die auchnicht richtig angeschaut ;)
Aber trotzdem danke - ich speicher mir die mal schnell in meine sammlung ;)

Grüße, Morph
 
Zurück