1 Waarde uit een array wissen, rest laten staan.

Status
Niet open voor verdere reacties.

BrEeZeR

Inventaris
Lid geworden
27 apr 2001
Berichten
12.877
Hey,

Ik wil in mijn blogscript graag een foto verwijderen, maar aangezien ik de fotoid's als komma gescheiden waardes in de database opsla en de foto wil verwijderen bedacht ik het volgende.

1. Array maken van de waarden in de DB.
2. Item uit array wissen.
3. Array imploden en weer naar de DB schrijven.

Nu is dit blijkbaar niet zo makkelijk (Is geen eens een bestaande functie voor :confused: )

Dus ging ik wat op zoek en kwam bij deze functie uit: (Na zelf aangepast te hebben, uiteraard.. want misten haakjes e.d.)

PHP:
function array_delete($array,$record_to_delete)
{  
    foreach($array as $index=>$element)
	{
		if($element==$record_to_delete) 
		{			
            unset($array[$index]); 
		}
	}

	return($array);	
}

Deze werkt prima, want als ik in de functie zelf NA het unsetten van dat item print_r($array); doe is het inderdaad verwijderd.

Geef hem netjes terug aan het script, maar die blijkt hem niet in zijn nieuwe vorm te pakken.

PHP:
	$foto = explode(",", $getblog[1]->fotoid);

	array_delete($foto, $tpl['fotoid']);

	$foto_nieuw = implode(",", $foto);

	echo $foto_nieuw;

Krijg gewoon de oude waardes van de eerste $foto.. terwijl die toch aangepast en teruggegeven is ? :confused:

Iemand die de fout ziet ?

Thx ! :)
 
$foto = explode(",", $getblog[1]->fotoid);

$foto2 = array_delete($foto, $tpl['fotoid']);

$foto_nieuw = implode(",", $foto2);

echo $foto_nieuw;

de variabele werkt prima binnenin de functie. Zodra je vanuit buiten de functie deze wilt overnemen moet je de doellokatie ook vermelden:
$nieuwestring = funtie_naam($var1, $var2);

hopelijk heb je er wat aan. :D
 
PHP:
function array_delete( &$array,$record_to_delete )
{  
    foreach( $array AS $index => $element )
    {
        if( $element == $record_to_delete )
        {            
            unset( $array[$index] );
        }
    }

    return $array;    
}
Kan ook nog :)

Note the & voor $array bij de functiedeclaratie.



Simpeler voorbeeldje hierover:
PHP:
<?php
function bla( &$var )
{
  $var += 10;
}

$var = 5;
echo ( $var . '<br>');
bla( $var );
echo $var;
?>
Leesvoer.

Overigens, dat hele implode() - explode() gedoe klinkt als vervelend werk, daar moet absoluut een betere manier voor te vinden zijn :)
Database-herinrichting (koppeltabellen ?), serializen, ...
 
Overigens, dat hele implode() - explode() gedoe klinkt als vervelend werk, daar moet absoluut een betere manier voor te vinden zijn :)

Wat kan is:

$string = str_ireplace(",".$keyname, "", $string);

voorbeeld:
$string = "1,2,3,4,5,6";
$keyname="4";
$string = str_ireplace(",".$keyname, "", $string);
echo $string; // 1,2,3,5,6

werkt dus niet met de eerste key (geen voorloopkomma)

zie ook: http://nl2.php.net/manual/en/function.str-ireplace.php
 
Geplaatst door RetroX
Wat kan is:

$string = str_ireplace(",".$keyname, "", $string);

voorbeeld:
$string = "1,2,3,4,5,6";
$keyname="4";
$string = str_ireplace(",".$keyname, "", $string);
echo $string; // 1,2,3,5,6

werkt dus niet met de eerste key (geen voorloopkomma)
Leuk, maar nee.

Ten eerste geef je zelf al aan dat dit niet met de eerste key werkt, uiteraard is hier wel wat op te vinden door hier simpelweg een ',' voor te zetten.
Ten tweede werkt str_ireplace() enkel op PHP 5, voor zover ik weet werkt BrEeZeR daar niet mee.

Wat ik bedoelde was dat je ipv een kolom hebt waarin je alle fotoid's achter elkaar zet, een koppeltabel maakt, met slechts twee kolommen. `fotoid` en `blogid`. Hierin verwijst `fotoid` naar de tabel met alle foto-informatie en `blogid` naar de tabel met de blogs (ik ga er trouwens vanuit dat je die foto's aan een blog koppelt, dat is wat ik haalde uit je openingspost). De primaire sleutel van deze tabel ligt over beide kolommen heen (de combinatie van fotoid met blogid moet uniek zijn). Let wel dat ik niet precies weet hoe je blogsysteem in elkaar zet, wat dat betreft zou 't ook kunnen zijn dat die primaire sleutel er juist niet op moet zitten ;)

Niet alleen is dit veel eleganter en meer volgens de regels van het relationele databasemodel, het is performance-gezien ook sneller en je hebt veel minder rompslomp. Even een query uitvoeren waarin je een rij verwijderd uit die koppeltabel en je bent klaar, geen gedoe met implode(), explode() en andere string functies.
 
Hm, juistja. Als ik bij een volgend project weer eens zin heb om nieuwe dingen aan te leren zal ik me er eens in verdiepen.

Momenteel ben ik allang blij dat het werkt en het is toch alleen voor mezelf dus np dat het wat minder netjes is :)

Ik gebruik PHP 4.x (Weet zo snel niet wat de hoster gebruikt).
 
@JPeetje

str_ireplace is inderdaad php5, eventueel kan je bij php4 nog str_replace gebruiken (dus niet hoofdletter gevoelig)

Ik ben uiteraard met je eens dat dit niet de mooiste oplossing is maar wel een van de eenvoudigste. ;)
 
Geplaatst door RetroX
Ik ben uiteraard met je eens dat dit niet de mooiste oplossing is maar wel een van de eenvoudigste. ;)
Persoonlijk vind ik mijn oplossing ook makkelijker, je hoeft minder te prutsen met die strings en array's :D

Maar iedere persoon vind iets anders weer makkelijker ... :)
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan