[PHP] Array elementen imploden naar string

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Reveller
  • Registratie: Augustus 2002
  • Laatst online: 05-12-2022
Ik heb de volgende array:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
Array
(
    [1] => Array
        (
            [dennis] => 0
            [erik] => 0
            [frank] => 1
            [elise] => 1
        )

    [2] => Array
        (
            [kees] => 0
            [jan] => 0
        )

    [3] => Array
        (
            [linda] => 0
            [erika] => 1
        )
)
De array geeft weer welke mensen van elke werkgroep meegaan op schoolreis. Uit groep 3 (bestaande uit linda en erika) gaat erika dus mee op reis.

Ik wil de mensen die meegaan als 1 string in een database zetten. Bijvoorbeeld groep 1:
code:
1
INSERT INTO groepen (schoolreis) VALUES ('frank, elise') WHERE group_id = 1
Om de query op te bouwen heb ik nu het volgende:
PHP:
1
2
3
4
foreach ($list as $group_id => $participant)
{
  $schoolreis = implode(", ", array_keys($participant));
}

De output hiervan is "0, 0, 0, 1, 1, 10, 0, 0, 0, 0, 00, 0, 0, 0, 0, 1" en niet het verwachte "frank, elise" (voor de eerste ronde), "erika" (voor de derde ronde). Ik snap het niet want volgens mij:
• doorloop ik de array groep voor groep?
• is $participant toch een string en geen integer (0, 0, 0, 1 ...)?

Ik hoop dat mijn probleem duidelijk is. Wie helpt mij op weg zodat $schoolreis wel de goede strings krijgt te bevatten?

"Real software engineers work from 9 to 5, because that is the way the job is described in the formal spec. Working late would feel like using an undocumented external procedure."


Acties:
  • 0 Henk 'm!

  • Reinier
  • Registratie: Februari 2000
  • Laatst online: 22:49

Reinier

\o/

array_keys() geeft misschien de keys terug, en niet de values?

Inderdaad, .oisyn is right.

[ Voor 23% gewijzigd door Reinier op 18-01-2005 13:46 ]


Acties:
  • 0 Henk 'm!

  • Michali
  • Registratie: Juli 2002
  • Laatst online: 29-05 22:54
array_values()

of

PHP:
1
2
3
4
5
6
7
8
<?
$schoolreis = array();
foreach ($list as $participant)
{
  $schoolreis = array_merge($schoolreis, $participant);
}
$resultaat = implode(", ", schoolreis);
?>

[ Voor 117% gewijzigd door Michali op 18-01-2005 12:20 ]

Noushka's Magnificent Dream | Unity


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 03:42

.oisyn

Moderator Devschuur®

Demotivational Speaker

Jullie moeten even goed lezen, hij wil ook de keys en niet de values.

Reveller: ik heb wel het idee dat er wat code mist, want ik zie nergens waar je de selectie maakt tussen de mensen die wel mee op schoolreis gaan en degenen die niet meegaan. Maar als $list idd de array is zoals je 'm in je startpost gedefinieerd hebt dan zou $schoolreis bij elke iteratie de namen van die groep mensen moeten zijn ($group_id is een integer, en $participant is een key-value array)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

(jarig!)
Dit gaat niet met een implode, omdat je afhankelijk van die 0 of 1 wel of niet de waarde mee wilt hebben. Je zult een dubbele for(each) moeten toepassen.
Overigens is die insert-query die je post niet correct en gaat het ook niet zo werken, wellicht met zoiets wel:
insert into tabel values (x1, y1, z1), (x2, y2, z2), ...

[ Voor 36% gewijzigd door ACM op 18-01-2005 12:31 ]


Acties:
  • 0 Henk 'm!

  • Reveller
  • Registratie: Augustus 2002
  • Laatst online: 05-12-2022
ACM schreef op dinsdag 18 januari 2005 @ 12:30:
Overigens is die insert-query die je post niet correct en gaat het ook niet zo werken, wellicht met zoiets wel:
insert into tabel values (x1, y1, z1), (x2, y2, z2), ...
'frank, elise' in mijn query zijn niet twee values (vergelijk ('frank', 'elise')) maar de geimplode string met namen van de mensen die meegaan op schoolreis :)

de regel: echo implode(', ', array_keys($participant)) levert nu een string op van ALLE namen uit elke groep. Is er een mogelijkheid om diezelfde regel aan te passen zodat alleen keys met value 1 worden geimplode of kan het alleen maar met een extra for lus?

[ Voor 10% gewijzigd door Reveller op 18-01-2005 12:56 ]

"Real software engineers work from 9 to 5, because that is the way the job is described in the formal spec. Working late would feel like using an undocumented external procedure."


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 03:42

.oisyn

Moderator Devschuur®

Demotivational Speaker

Daar kun je array_filter voor gebruiken

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • T-MOB
  • Registratie: Maart 2001
  • Laatst online: 22:34
Als je het echt met implode wil doen dan kan dat wel. Dan moet je eerst alle "omgeldige" waarden uit je array halen. Even creatief:
PHP:
1
2
$mee = array(1);
$resultaat = implode(',', array_keys(array_intersect($participant, $mee)));

Regeren is vooruitschuiven


Acties:
  • 0 Henk 'm!

  • Reveller
  • Registratie: Augustus 2002
  • Laatst online: 05-12-2022
Dank voor jullie hulp :) Vooral die 'dubbele for loop' deed het hem. @T-MOB; goed om te weten hoe het ook kan met array_intersect (kende die functie nog niet) maar idd wat omslachtig. Uiteindelijk heb ik het zo opgelost:
PHP:
1
2
3
4
5
6
7
8
9
10
foreach ($list as $group_id => $participant)
{
  foreach ($participant as $key => $value)
  if ($value == 1) $string[] = $key;

  db_query("INSERT INTO groepen (schoolreis) VALUES ('%s') WHERE group_id = %d",
            implode(', ', $string), $group_id);

  unset($string);
}

Werk goed :) Als iemand nog ideeen heeft om het korter / beter te doen, hoor ik dat uiteraar altijd graag!

[ Voor 6% gewijzigd door Reveller op 18-01-2005 14:25 ]

"Real software engineers work from 9 to 5, because that is the way the job is described in the formal spec. Working late would feel like using an undocumented external procedure."


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 03:42

.oisyn

Moderator Devschuur®

Demotivational Speaker

T-MOB schreef op dinsdag 18 januari 2005 @ 13:04:
Als je het echt met implode wil doen dan kan dat wel. Dan moet je eerst alle "omgeldige" waarden uit je array halen. Even creatief:
PHP:
1
2
$mee = array(1);
$resultaat = implode(',', array_keys(array_intersect($participant, $mee)));
Daar hebben ze array_filter dus voor uitgevonden, verwijderd alle elementen die gelijk zijn aal false. Of je geeft een callback mee die wordt aangeroepen voor elk element, maar aangezien Reveller zijn array al op een dergelijke manier geordend heeft voldoed een array_filter($participant) dus prima

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • X-Lars
  • Registratie: Januari 2004
  • Niet online

X-Lars

Just GoT it.

@Reveller: als je $string-array leeg blijft krijg je met die code een foutmelding imo ;)

En de eerste foreach kan in dit geval met alleen foreach($list as $participant) af.
Pagina: 1