Toon posts:

[PHP] Multidimensionale arrays combineren

Pagina: 1
Acties:

Vraag


  • Flying
  • Registratie: september 2003
  • Laatst online: 14:53
Momenteel heb ik twee verschillende multidimensionale arrays die ik met elkaar wil combineren. De eerste array betreft een volledige lijst items, terwijl de tweede array een lijst is van enkele items die voorkomen in de eerste array, maar waarvan enkele waarden verschillend zijn.

De bedoeling is om de twee arrays met elkaar te combineren waarbij de eerste array geüpdatet wordt met de tweede array en dat op de juiste locatie.

Een concreet voorbeeld:
Array 1:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
array(3) { 
    [0]=> array(10) { 
        ["maat_id"]=> string(1) "1" 
        ["cat_id"]=> string(1) "1" 
        ["maatregel"]=> string(20) "Algemene maatregel 1" 
        ["L1"]=> int(0)
        ["L2"]=> int(0) 
        ["L3"]=> int(0)
        ["L4"]=> int(0)
        ["L5"]=> int(0)
        ["L6"]=> int(0)
        ["BIS"]=> int(0)
    } 
    [1]=> array(10) { 
        ["maat_id"]=> string(1) "2" 
        ["cat_id"]=> string(1) "1" 
        ["maatregel"]=> string(20) "Algemene maatregel 2" 
        ["L1"]=> int(0)
        ["L2"]=> int(0) 
        ["L3"]=> int(0)
        ["L4"]=> int(0)
        ["L5"]=> int(0)
        ["L6"]=> int(0)
        ["BIS"]=> int(0)
    } 
    [2]=> array(10) { 
        ["maat_id"]=> string(1) "3" 
        ["cat_id"]=> string(1) "2" 
        ["maatregel"]=> string(23) "Taalkundige maatregel 1" 
        ["L1"]=> int(0)
        ["L2"]=> int(0) 
        ["L3"]=> int(0)
        ["L4"]=> int(0)
        ["L5"]=> int(0)
        ["L6"]=> int(0)
        ["BIS"]=> int(0)
    } 
}


De tweede array:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
array(3) { 
    [0]=> array(10) { 
        ["maat_id"]=> string(1) "3" 
        ["cat_id"]=> string(1) "2" 
        ["maatregel"]=> string(23) "Taalkundige maatregel 1" 
        ["L1"]=> int(0)
        ["L2"]=> int(0) 
        ["L3"]=> int(1)
        ["L4"]=> int(1)
        ["L5"]=> int(0)
        ["L6"]=> int(1)
        ["BIS"]=> int(0)
    } 
}


Met de functie array_replace_recursive() heb ik getracht om de arrays met elkaar te combineren. Het combineren werkt, maar de verkeerde gegevens worden geüpdatet. De functie baseert zich op de key van de onderliggende array waardoor je volgende array krijgt:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
array(3) { 
    [0]=> array(10) { 
        ["maat_id"]=> string(1) "3" 
        ["cat_id"]=> string(1) "2" 
        ["maatregel"]=> string(23) "Taalkundige maatregel 1" 
        ["L1"]=> int(0)
        ["L2"]=> int(0) 
        ["L3"]=> int(1)
        ["L4"]=> int(1)
        ["L5"]=> int(0)
        ["L6"]=> int(1)
        ["BIS"]=> int(0)
    } 
    [1]=> array(10) { 
        ["maat_id"]=> string(1) "2" 
        ["cat_id"]=> string(1) "1" 
        ["maatregel"]=> string(20) "Algemene maatregel 2" 
        ["L1"]=> int(0)
        ["L2"]=> int(0) 
        ["L3"]=> int(0)
        ["L4"]=> int(0)
        ["L5"]=> int(0)
        ["L6"]=> int(0)
        ["BIS"]=> int(0)
    } 
    [2]=> array(10) { 
        ["maat_id"]=> string(1) "3" 
        ["cat_id"]=> string(1) "2" 
        ["maatregel"]=> string(23) "Taalkundige maatregel 1" 
        ["L1"]=> int(0)
        ["L2"]=> int(0) 
        ["L3"]=> int(0)
        ["L4"]=> int(0)
        ["L5"]=> int(0)
        ["L6"]=> int(0)
        ["BIS"]=> int(0)
    } 
}


Hier is item [0] gewijzigd van de originele lijst. De bedoeling is dat de functie gebruik zou maken van de maat_id binnen elke onderliggende array, maar daarvoor lijkt de functie niet geschikt. Hoe kan ik dit het beste oplossen?

Optie lijkt me om te proberen de keys van de array ([0], [1], [2], ...) te vervangen door de maat_id. Geen idee hoe ik eraan begin, maar dat zal vast wel te vinden zijn (array_walk_recursive() ?).
Is er een andere optie, betere optie? Het had mooi geweest als de array_replace_recursive() zich kon baseren op een onderliggende waarde in plaats van de gewone keys...

Alle reacties


  • DJMaze
  • Registratie: juni 2002
  • Niet online
Er zijn heel veel opties. De makkelijkste is inderdaad
PHP:
1
$array[$row['maat_id']] = $row;

Maak je niet druk, dat doet de compressor maar


  • Hopscotch
  • Registratie: september 2015
  • Laatst online: 28-09 22:24
Je maakt het jezelf en vooral degene die de code na jou moet onderhouden een heel stuk makkelijker door hier objecten te gebruiken en geen afkortingen:
code:
1
2
3
4
5
6
7
8
9
10
class Maatregel {

    private $id;
    private $categorie;
    private $naam;
    private $bis;
    private $l1;
    ... 

}


Verder is het inderdaad het handigst om te zorgen dat de keys van je array gelijk zijn aan de maat_id dan kan je doen wat @DJMaze suggereert.

  • Flying
  • Registratie: september 2003
  • Laatst online: 14:53
Diegene die het moet onderhouden ben ikzelf en de realisatie dat OOP hier handiger was geweest is er wel. Ik heb geen ervaring met OOP.

Uit de database haal ik alle maatregelen op en haal ik ook alle maatregelen op die van toepassing zijn op dat moment. Dat ophalen resulteert nu twee arrays en die moeten met elkaar gecombineerd worden om het formulier met aanvinkvakken te op te bouwen.

Bij de methode van @DJMaze , maak ik dan beter een nieuwe array van de andere twee of kan ik met een foreach gewoon alles doorlopen? Gaandeweg leer ik veel bij.

De OOP route zie ik wel zitten, maar dan vrees ik dat ik alles moet herschrijven. Heb je goede documentatie voor die aanpak met de class?

  • mcDavid
  • Registratie: april 2008
  • Nu online
Flying schreef op maandag 23 september 2019 @ 14:12:
Uit de database haal ik alle maatregelen op en haal ik ook alle maatregelen op die van toepassing zijn op dat moment. Dat ophalen resulteert nu twee arrays en die moeten met elkaar gecombineerd worden om het formulier met aanvinkvakken te op te bouwen.
Dat klinkt alsof je dit probleem eigenlijk beter in je query kunt oplossen? Waarom gebruik je 2 aparte queries in plaats van één die alle benodigde maatregelen ophaalt?
De OOP route zie ik wel zitten, maar dan vrees ik dat ik alles moet herschrijven. Heb je goede documentatie voor die aanpak met de class?
lees je eens in in ORM's zou ik zeggen, bijvoorbeeld Doctrine. Kan je veel werk uit handen nemen.

[Voor 6% gewijzigd door mcDavid op 23-09-2019 14:23]


  • Flying
  • Registratie: september 2003
  • Laatst online: 14:53
mcDavid schreef op maandag 23 september 2019 @ 14:23:
[...]

Dat klinkt alsof je dit probleem eigenlijk beter in je query kunt oplossen? Waarom gebruik je 2 aparte queries in plaats van één die alle benodigde maatregelen ophaalt?
De reden is dat het twee afzonderlijk queries zijn. Eén query haalt werkelijk alle mogelijk maatregelen op, want die moeten allemaal in de fiche getoond worden aan de gebruiker. De tweede haalt uit een andere database alle maatregelen op die reeds aan die bepaalde fiche gekoppeld zijn.

De gebruiker ziet in het formulier vervolgens vinkjes staan bij de maatregelen die reeds van de toepassing zijn en kan extra vinkjes plaatsen bij andere maatregelen of bij klassen bij een reeds bestaande maatregel.

Het zijn twee verschillende queries en de klassen die eraan gekoppeld zijn, zijn enkel gekoppeld aan die bepaalde fiche en die bepaalde klas. De tabel met maatregelen bevat noch een koppeling met de klassen noch met de fiches, gezien die koppeling in een andere tabel tot stand komt. De velden komen daarbij ook nog niet overeen.

Eerlijk is eerlijk, dit is het laatste probleem waarmee ik zit. De rest van de website is reeds afgewerkt. Als dat af is en naar behoren werkt, kan ik het ding lanceren en achterliggend aan de slag gaan om te bekijken of ik het naar OOP kan omzetten.

Er rest enkel nog het uitzoeken dan hoe ik de sleutel van de onderliggende arrays wijzig naar de maatregel id en daarna de database update coderen.

  • DJMaze
  • Registratie: juni 2002
  • Niet online
Flying schreef op maandag 23 september 2019 @ 15:31:
De reden is dat het twee afzonderlijk queries zijn.

Eén query haalt werkelijk alle mogelijk maatregelen op, want die moeten allemaal in de fiche getoond worden aan de gebruiker.

De tweede haalt uit een andere database alle maatregelen op die reeds aan die bepaalde fiche gekoppeld zijn.
Gevalletje:
SQL:
1
2
3
4
5
6
7
8
9
10
11
12
13
SELECT
    t1.maat_id,
    t1.cat_id,
    t1.maatregel,
    COALESCE(t2.L1, t1.L1) L1,
    COALESCE(t2.L2, t1.L2) L2,
    COALESCE(t2.L3, t1.L3) L3,
    COALESCE(t2.L4, t1.L4) L4,
    COALESCE(t2.L5, t1.L5) L5,
    COALESCE(t2.L6, t1.L6) L6,
    COALESCE(t2.BIS, t1.BIS) BIS
FROM database1.tabel1 t1
LEFT JOIN database2.tabel1 t2

Maak je niet druk, dat doet de compressor maar


  • Flying
  • Registratie: september 2003
  • Laatst online: 14:53
DJMaze schreef op maandag 23 september 2019 @ 15:45:
[...]


Gevalletje:
SQL:
1
2
3
4
5
6
7
8
9
10
11
12
13
SELECT
    t1.maat_id,
    t1.cat_id,
    t1.maatregel,
    COALESCE(t2.L1, t1.L1) L1,
    COALESCE(t2.L2, t1.L2) L2,
    COALESCE(t2.L3, t1.L3) L3,
    COALESCE(t2.L4, t1.L4) L4,
    COALESCE(t2.L5, t1.L5) L5,
    COALESCE(t2.L6, t1.L6) L6,
    COALESCE(t2.BIS, t1.BIS) BIS
FROM database1.tabel1 t1
LEFT JOIN database2.tabel1 t2
t2 bevat in dit geval maat_id, klas_id, leerling_id en fiche_id. De velden L1>BIS staan in de tabel klas. Ik haal nu zoals jij aangeeft alles op van t1 (de genoemde velden) en alles op van t2 in twee verschillende arrays. De velden L1>BIS maak ik zelf aan bij de twee arrays.

Ik ben er niet voldoende in onderlegd en ging niet zonder veel zoekwerk op dergelijke oplossing uitkomen. Het is me in ieder geval gelukt om de arrays te hernoemen, maar mocht het alsnog gecombineerd kunnen worden tot één query zou dat fantastisch zijn. Alleen met de opbouw van de database twijfel ik een beetje of dat kan?

Jullie zijn alvast allemaal erg behulpzaam!

  • DJMaze
  • Registratie: juni 2002
  • Niet online
Flying schreef op maandag 23 september 2019 @ 15:58:
Ik ben er niet voldoende in onderlegd en ging niet zonder veel zoekwerk op dergelijke oplossing uitkomen.
En wat heeft je leraar dan al wel uitgelegd?
Hij laat je nu wel heel erg zwemmen door foute code te schrijven.

Maak je niet druk, dat doet de compressor maar


  • Flying
  • Registratie: september 2003
  • Laatst online: 14:53
De leraar heeft niets uitgelegd, het is volledig op mezelf, hobbymatig :)

Edit: ik ben zelf leraar overigens :P

[Voor 22% gewijzigd door Flying op 23-09-2019 17:05]

Pagina: 1


Nintendo Switch (OLED model) Apple iPhone 13 LG G1 Google Pixel 6 Call of Duty: Vanguard Samsung Galaxy S21 5G Apple iPad Pro (2021) 11" Wi-Fi, 8GB ram Nintendo Switch Lite

Tweakers vormt samen met Hardware Info, AutoTrack, Gaspedaal.nl, Nationale Vacaturebank, Intermediair en Independer DPG Online Services B.V.
Alle rechten voorbehouden © 1998 - 2021 Hosting door True

Tweakers maakt gebruik van cookies

Bij het bezoeken van het forum plaatst Tweakers alleen functionele en analytische cookies voor optimalisatie en analyse om de website-ervaring te verbeteren. Op het forum worden geen trackingcookies geplaatst. Voor het bekijken van video's en grafieken van derden vragen we je toestemming, we gebruiken daarvoor externe tooling die mogelijk cookies kunnen plaatsen.

Meer informatie vind je in ons cookiebeleid.

Sluiten

Forum cookie-instellingen

Bekijk de onderstaande instellingen en maak je keuze. Meer informatie vind je in ons cookiebeleid.

Functionele en analytische cookies

Deze cookies helpen de website zijn functies uit te voeren en zijn verplicht. Meer details

janee

    Cookies van derden

    Deze cookies kunnen geplaatst worden door derde partijen via ingesloten content en om de gebruikerservaring van de website te verbeteren. Meer details

    janee