Tot hier toe nog alles prima.
Nu is de vraag hoe ik die cells kan uitlezen. Moet dit dan met een foreach onder een foreach?
Ik heb al verschillende dingen geprobeerd maar het werkt niet.
cells apart behandelen? Je zou met een switch-statement op $key of een simpel if-statement het onderscheid kunnen maken tussen de verschillende elemenenten en de specifieke afhandeling daarvan.
Eigenlijk is het einddoel om hier de cells over te houden, met de rijnummers enz ben ik eigenlijk niks. Ik ben gewoon aan het proberen om tot mijn eindresultaat te komen, maar het lukt dus niet. Kan jij mij hiermee verder helpen?
Ik ben totaal niet mee met je switch-statement
Toevoeging op 17/04/2016 15:08:19:
Ok Thomas, na een beetje opzoekwerk heb ik de code tot zover al kunnen juist zetten:
for($i = 0; $i < count($array['rows']); $i++) {
foreach($array['rows'][$i] as $key => $value)
{
//echo $key. ': '.$value;
//echo '<br>';
switch ($key) {
case id:
echo 'id: '.$value.' <br>';
break;
case rowNumber:
echo 'rowNumber: '.$value.' <br>';
break;
case siblingId:
echo 'siblingId: '.$value.' <br>';
break;
case expanded:
echo 'expanded: '.$value.' <br>';
break;
case createdAt:
echo 'createdAt: '.$value.' <br>';
break;
case modifiedAt:
echo 'modifiedAt: '.$value.' <br>';
break;
case cells:
echo 'cells: '.$value.' <br>';
break;
default:
echo '';
}
}
echo '<br>';
}
Nu zit ik nog vast op de array van de cells. Hoe krijg ik die te zien?
Toevoeging op 17/04/2016 16:01:58:
We zitten alweer een stukje verder. Ik heb ondertussen met een 2de switch mijn array uit elkaar gehaald:
Dit geeft als resultaat (terug 1 blok uit de lus):
id: 4113404345509764
rowNumber: 15
siblingId: 3498136321714052
expanded: 1
createdAt: 2016-04-09T21:20:50Z
modifiedAt: 2016-04-13T19:40:25Z
Cells:
value 0: Todo
value 0: Wijzigen van logica -> opsplitsen van franchisers naar bedrijf + werknemers
value 0: Management/Planning
value 0: 1
value 0: Voltooid
value 0: 2016-04-09T21:20:50Z
value 0: 2016-04-13T15:50:01Z
value 0: bsl
Maar nu zou ik die value 0 willen splitsen in meerdere werkbare items zoals bvb value0 = 'Todo', value1 = '...', enz
Je zou ook kunnen overwegen om een nieuw array te bouwen die wat makkelijker is in het gebruik. Het enige wat je over wilt houden is de cellen per rij? En misschien het id? Ik vind het oorspronkelijke formaat een beetje wollig, maar daar kun je waarschijnlijk weinig aan veranderen.
Zoiets dan?
<?php
$array = json_decode($sheetsResponse, true);
$myData = array();
foreach ($array['rows'] as $rowNumber => $rowData) {
$myData[$rowNumber] = array(
'id' => $rowData['id'],
'data' => array(),
);
// maak hier vervolgens een soort van filter voor de cells data waar je in geinteresseerd bent
foreach ($rowData['cells'] as $k => $v) {
// doe bijvoorbeeld een (gedeeltelijke) match op naam
if (...) { // <-- hier moet je nog zelf een soort van invulling aan geven, of verder toelichten hoe cells er uitziet
// en sla dit op in $myData
$myData[$rowNumber]['data'][] = $v;
}
}
}
// nu kun je $myData gebruiken, die enkel de data bevat die je nodig hebt
?>
Ik ben niet helemaal mee met wat je bedoeld. Je hebt ook de for loop overgeslagen? Nu krijg je toch niet alle rows en cells terug?
Ik heb proberen iets te doen maar het is ook zo niet goed:
$array = json_decode($sheetsResponse, true);
$myData = array();
foreach ($array['rows'] as $rowNumber => $rowData) {
$myData[$rowNumber] = array(
'id' => $rowData['id'],
'data' => array(),
);
// maak hier vervolgens een soort van filter voor de cells data waar je in geinteresseerd bent
foreach ($rowData['cells'] as $k => $v) {
// doe bijvoorbeeld een (gedeeltelijke) match op naam
if ($k = 'value') { // <-- hier moet je nog zelf een soort van invulling aan geven, of verder toelichten hoe cells er uitziet
// en sla dit op in $myData
$myData[$rowNumber]['data'][] = $v;
}
}
}
// nu kun je $myData gebruiken, die enkel de data bevat die je nodig hebt
echo 'Test: '.$myData['data'][0];
Toevoeging op 17/04/2016 20:31:48:
Ik had aan mijn eigen code ook nog wat zitten aanpassen maar hier ben ik er ook nog niet uit:
Maar ik kan met $items[0] en $items[1] precies niet werken
Als ik iets wil zoals echo 'Wat? '.$items[0].'<br>'; en echo 'Omschrijving: '.$items[1].'<br>'; dan gaat het helemaal fout en krijg ik een herhaling van dezelfde Wat? en Omschrijving zolang de lus niet rond is.
Dan vroeg ik mij af of er iets mis was aan die for loop of foreach maar kan het niet vinden.
De cell data van de eerste rij zit in $myData[0]['data'] (en dus niet in $myData['data'][0] of wat dan ook), en dit is een array, dus die kun je sowieso niet afdrukken op die manier...
Ik denk dat het voor de (jouw) begripsvorming handig en verstandig is om de inhoud eens wat vaker in een leesbare vorm te dumpen naar je scherm, bijvoorbeeld met een eenvoudige functie:
@Thomas: ik heb je functie gebruikt en dit is inderdaad wel handig.
Voor de rest ben ik niet goed mee wat je bedoeld met:
foreach ($rowData['cells'] as $k => $v) {
// doe bijvoorbeeld een (gedeeltelijke) match op naam
if ($k = 'value') { // <-- hier moet je nog zelf een soort van invulling aan geven, of verder toelichten hoe cells er uitziet
// en sla dit op in $myData
$myData[$rowNumber]['data'][] = $v;
}
}
Vooral de if statement is hier niet duidelijk. Ik heb onder de cells een waarde value maar die komt er niet uit. Hieronder de array die ik tot nu toe heb (opgevraagd met dump($myData[0]['data']);):
Uit jouw eerste reactie waarin je een voorbeeld geeft van de inhoud van "cells" maakte ik op dat dit array, net zoals de data die in de "rows" zit méér data bevat dan die jij strict gesproken nodig had en ook sprak hier min of meer de wens uit om dit te herstructureren tot iets wat makkelijker in het gebruik is. Klopt dit?
Misschien moeten we dit anders aanpakken.
Zou jij een voorbeeld kunnen geven van de invoer zoals je die "rauw" binnenkrijgt (de json_dedecode variant). Geef hier bijvoorbeeld twee of drie rijen data van, eventueel geanonimiseerd zodat deze geen gevoelige/persoonlijke informatie bevat.
Zou je vervolgens een voorbeeld kunnen geven welke informatie je hier vervolgens van over wilt houden en welke vorm dit zou moeten hebben. Dit laatste is dus een voorbeeld van uitvoer.
Als beide puzzelstukken wat duidelijker zijn (de vorm van de in- en uitvoer) kunnen we waarschijnlijk een stuk makkelijker wat code in elkaar fietsen om deze twee te verenigen.
Misschien eventjes terugkomen op je eerder geplaatste code. We geraken er misschien wel nog aan uit zonder opnieuw te moeten beginnen. Wat ik tot nu toe heb gedaan is je code aangepast naar het onderstaande:
Dit geeft mij een mooi overzicht van 1 rij wat ik wil hebben. Alleen zitten we hier nog met een klein probleem. De eerste cell krijg ik niet te zien. In de code kan ik die normaal gesproken opvragen met $myData[71]['data'][0]['value'] maar dan krijg ik de 2de cell te zien, enz.
En bijkomend:
Uiteraard moeten nu nog alle rijen in een for loop zodat hij alle rijen afloopt die er zijn. Op dit moment meer dan 200.
Kan je hiermee verder? Of moet ik in 'invoer' en 'uitvoer' ook nog eens posten en beginnen we opnieuw?
Dit geeft mij een mooi overzicht van 1 rij wat ik wil hebben. Alleen zitten we hier nog met een klein probleem. De eerste cell krijg ik niet te zien. In de code kan ik die normaal gesproken opvragen met $myData[71]['data'][0]['value'] maar dan krijg ik de 2de cell te zien, enz.
Komt dit niet door je if-statement?
Die zegt:
<?php
if ($k) {
// ...
}
?>
Als $k gelijk is aan 0, een lege string of iets soortgelijks is dit equivalent aan:
<?php
if (false) {
// ...
}
?>
En dat wordt dus nooit uitgevoerd...
Als je die foreach (regel 3 t/m 17 uit bovenstaande fragment) nu gewoon eens vervangt door:
Het eerste gedeelte over de if is juist. Ik heb deze weggelaten en dan is het prima. Dus nu nog juist die for loop of jouw aangepaste versie. Ik heb dit uitgetest maar ik moet hier toch nog altijd een nummer achterlaten van een bepaalde row? Dus ik kan gegevens opvragen met $rowData[73] bvb en dan krijg ik dit:
Nu loop ik nog steeds niet door de bepaalde rijen? Met die for loop bedoelde ik eigenlijk dat ik met $i en $i++ door alles kan lopen, dus m.a.w gewoon alle rijen kan opvragen en de daarbij horende cellen kan weergeven.