[PHP] 1 Waarde + key uit een array verwijderen

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Deviruchi
  • Registratie: December 2006
  • Laatst online: 20-09 21:58
Ik heb dus in mijn database een komma gescheiden string staan met getallen, bijvoorbeeld 1,2,3. Dit zijn user_id's, nu wil ik bijvoorbeeld user_id 2 verwijderen. Dit leek me heel makkelijk te gaan, even explode, unset, en vervolgens weer implode. Maar zo simpel lijkt het me nu niet meer.

De code waar het om gaat:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// Get the user id's from the database, put them in an array, and explode the array.
    $iAllUserIds = mysql_fetch_array( $oUser->doQuery("SELECT user_id FROM link_user_performance WHERE performance_id = " . $_GET['performance_id'] ) );
    $aAllUserIds = explode( ",", $iAllUserIds['user_id'] );

    // Find the user_id in the array, then remove it.
    $iKey = array_search( $_GET['user_id'], $aAllUserIds );
    unset( $aAllUserIds[$iKey] );

    // Then sort and filter the array for uniques and put the array together.
    $aAllUserIds = sort( array_unique( $aAllUserIds ) );
    if ( count( $aAllUserIds ) > 1){
        $iUserIds = implode( ",", $aAllUserIds );
    } else {
        $iUserIds = $aAllUserIds;
    }

    print_r($iUserIds);
    echo "<br>";
    print_r($aAllUserIds);


Als ik dit script uitvoer, krijg ik: 1<br>1, met var_dump geeft hij een bool(true) terug, na me even in de functies verdiept te hebben, kan ik niet een functie in deze code vinden die true teruggeeft, dus dat vond ik al heel raar, vervolgens een stukje code van php.net geprobeerd:

PHP:
1
2
3
4
5
6
7
8
9
  // Remove the user from the array.
    function array_remove(&$a_Input, $m_SearchValue) {
        $a_Keys = array_keys($a_Input, $m_SearchValue);
        foreach($a_Keys as $s_Key) {
            unset($a_Input[$s_Key]);
        }
        return $a_Input;
    }
    $aAllUserIds = array_remove($aAllUserIds, $_GET['user_id']);


Dit geeft _precies_ hetzelfde resultaat, en ik ben er nu echt al een tijd mee bezig om dit werken te krijgen, maar ik begin te hoop te verliezen. Ik hoop dat één van jullie me met dit probleem kan helpen.

Acties:
  • 0 Henk 'm!

Verwijderd

Deviruchi schreef op zaterdag 31 maart 2007 @ 16:03:
Ik heb dus in mijn database een komma gescheiden string staan met getallen, bijvoorbeeld 1,2,3.
De gemiddelde programmeur zal niet verder lezen dan deze regel. Terug naar de tekentafel, eerst je database normaliseren, en dus die "kommagescheiden waarden" in een aparte tabel zetten.

Als je tóch jouw bad practice aan wilt houden: gebruik dan array_splice.

Acties:
  • 0 Henk 'm!

  • Deviruchi
  • Registratie: December 2006
  • Laatst online: 20-09 21:58
Verwijderd schreef op zaterdag 31 maart 2007 @ 16:08:
[...]

De gemiddelde programmeur zal niet verder lezen dan deze regel. Terug naar de tekentafel, eerst je database normaliseren, en dus die "kommagescheiden waarden" in een aparte tabel zetten.

Als je tóch jouw bad practice aan wilt houden: gebruik dan array_splice.
Dat zou inderdaad kunnen, ware het niet dat er 1 user_id kan staan, maar ook 1200, theoretisch gezien dan. Dan zou het een gekloot worden om telkens die velden weer aan te moeten maken, terwijl comma seperated values hier juist goed geschikt voor zijn.

Acties:
  • 0 Henk 'm!

  • Pyrus
  • Registratie: November 2001
  • Laatst online: 20-09 21:30

Pyrus

Hardknock life

De truuk is om een koppeltabel te maken Deviruchi ;)
Users
useridandere usermeuk


link_user_performance
link_idandere meuk


link_user_koppel
user_idlink_id


En als je nu iets uit die lijst met userid's wilt halen voor een link is het simpelweg
code:
1
DELETE FROM link_user_koppel WHERE user_id=X and link_id=Y

LinkedIn


Acties:
  • 0 Henk 'm!

  • Deviruchi
  • Registratie: December 2006
  • Laatst online: 20-09 21:58
Pyrus schreef op zaterdag 31 maart 2007 @ 16:29:
De truuk is om een koppeltabel te maken Deviruchi ;)
Users
useridandere usermeuk


link_user_performance
link_idandere meuk


link_user_koppel
user_idlink_id


En als je nu iets uit die lijst met userid's wilt halen voor een link is het simpelweg
code:
1
DELETE FROM link_user_koppel WHERE user_id=X and link_id=Y
Dat heb ik dus al, ik heb nu de table Users en link_user_performance
( link = koppel, ohja ;o )

Maargoed, dit ziet er dan zoiets uit:
users
user_id | etc

link_user_performance
user_id | performance_id | max_users

performance
performance_id | etc

Zo koppel ik dus een user aan een performance ( soort opdracht voor gebruikers ). Nu heb ik in link_user_performance bij de user_id komma's tussen de user_id's staan, zodat ik meerdere personen in 1 veld kan stoppen. Uiteraard kan ik voor elke user weer een nieuwe user_id | performance_id aanmaken, en de max_users bij de performance zelf neerzetten, maar dat zou niet moeten hoeven ( wow, rare zin :P ).

Acties:
  • 0 Henk 'm!

Verwijderd

Deviruchi schreef op zaterdag 31 maart 2007 @ 16:40:
Uiteraard kan ik voor elke user weer een nieuwe user_id | performance_id aanmaken, en de max_users bij de performance zelf neerzetten, maar dat zou niet moeten hoeven ( wow, rare zin :P ).
Lees eens iets over databases. Met name het stukje over normalisatie is interessant.
Waarom meen je beter te weten hoe je gegevens op moet slaan?

Acties:
  • 0 Henk 'm!

Verwijderd

Misschien komt de TS verder als hij de reference ( & ) weghaalt uit zijn delete-functie ;)

Acties:
  • 0 Henk 'm!

  • Icelus
  • Registratie: Januari 2004
  • Niet online
Deviruchi schreef op zaterdag 31 maart 2007 @ 16:40:
[...]


Dat heb ik dus al, ik heb nu de table Users en link_user_performance
( link = koppel, ohja ;o )

Maargoed, dit ziet er dan zoiets uit:
users
user_id | etc

link_user_performance
user_id | performance_id | max_users

performance
performance_id | etc

Zo koppel ik dus een user aan een performance ( soort opdracht voor gebruikers ). Nu heb ik in link_user_performance bij de user_id komma's tussen de user_id's staan, zodat ik meerdere personen in 1 veld kan stoppen. Uiteraard kan ik voor elke user weer een nieuwe user_id | performance_id aanmaken, en de max_users bij de performance zelf neerzetten, maar dat zou niet moeten hoeven ( wow, rare zin :P ).
Je opzet is goed. Ik weet alleen niet waar max_users voor staat — als het iets met ‘performance’ te maken heeft dient dit inderdaad naar deze tabel verplaatst te worden.

Het idee van de koppeltabel is dat er relaties tussen verschillende tabellen gelegd kunnen worden. Maak voor ieder user/performance paar een rij in de koppeltabel aan. Vervolgens kun je met één SELECT alle gebruikers met een specifieke performace_id kiezen.

Developer Accused Of Unreadable Code Refuses To Comment

Pagina: 1