Explode naar simpele array
Ik heb een vraagje over de explode functie.
Als ik een explode uitvoer dan word deze in een associative array gezet.
Kan dit ook naar een simple array vertaald worden?
Weet niet precies wat je bedoeldt met een simpel array, maar alle arrays hebben een index.
Indien je twijfelt over de (exacte) inhoud, en de typen van de elementen (want hierboven heb je een array met strings en eentje met integers, dus in die zin verschillen deze van elkaar), dan kun je altijd de inhoud inspecteren met hulpfuncties zoals print_r() of var_dump().
Code (php)
Resultaat:
$arr2 = Array ( '123', '456', '789' );
Klopt dat nog als $arr1 leeg is?
$arr1 is niet leeg, zie regel 2.
Gewijzigd op 20/11/2020 10:02:09 door - Ariën -
Als $arr1 leeg is, dan krijgt implode niets door, en geeft het een foutmelding.
Als de array van $arr1 leeg is, dan krijg je een werkende output:
Nog niet helemaal logisch dus omdat je toch een array blijft hebben met een leeg element
Gewijzigd op 20/11/2020 10:33:04 door - Ariën -
Het probleem is inderdaad dat als je een leeg array als invoer hebt er een (niet-leeg) array met een (leeg) element geretourneerd wordt.
Misschien is het handig als de topicstarter verder toelicht wat nu precies het probleem is? Een explode geeft aan dat het geserialiseerde invoer betrof waarbij blijkbaar de keys/indexen toch geen betekenis hadden. Wat maakt het dan uit welke index hier aan toegekend wordt met een explode? Zoals eerder aangehaald, alle arrays hebben indexen.
En hiervoor zou je nog kunnen kijken naar de aanpak. Waarom is de invoer uberhaupt geserialiseerd? Heb je invloed/zeggenschap op/over de vorm van de opslag? Wellicht wil je dat dan gestructureerd(er) aanpakken (dan de boel serialiseren) of in een standaard formaat gieten (bijvoorbeeld JSON)?
Youri vroeg: "Als ik een explode uitvoer dan word deze in een associative array gezet."
Waarna ik zei: "Een lege associatieve array heeft geen indexes."
Dus: van een lege array is hier geen sprake, want die levert geen indexes, en is daarmee niet associatief.
Waarom dan toch doorzagen? Kan je dan niet beter de code verbeteren met je eigen if()-je voor lege arrays?
Weet je wat? Ik doe het wel voor, dat voorkomt veel onnodige alinea's:
Code (php)
Kijk, nu werkt het ook met lege arrays. Goed he?
En ik hoor nu al een argument opborrelen: "Ja, maar nu heb je twee keer '$arr2 = Array ('.
Dat is voor de leesbaarheid.
Maar je bent natuurlijk vrij om daar hele mooie code van te maken. Plak het vooral hieronder. Succes.
Voordat je blindelings antwoord geeft op een vraag zou je natuurlijk ook na kunnen denken over de vraagstelling zelf, of deze zinnig is en of de ingeslagen weg wel hout snijdt. Tenzij je enige doel is om (antwoorden op de precieze vraag) te faciliteren kan ik mij hier misschien nog iets bij voorstellen, maar dit forum zou toch wat verder moeten gaan dan dat...
@Yoeri dumpt een array, en kreeg mogelijk meer te zien dan hij had verwacht, maar elk (fair enough, niet-leeg) array heeft indexen, dus het is logisch en accuraat dat je deze dan ook te zien krijgt.
Er bestaat niet zoiets als een "simpel array zonder indexen", dus waarom zou je een soort van dumpfunctionaliteit hebben die dit weerspiegelt? Tenzij je een soort van opmaak wilt toepassen op je dump? Maar zelfs dan, het nut van een dump lijkt mij nog steeds dat je de precieze inhoud weergeeft, hier inhoudelijke aanpassingen op uit gaan voeren lijkt mij niet wenselijk.
Misschien kan de topicstarter duidelijkheid verschaffen over hoe hij dit denkt te kunnen gebruiken?
Als dit alles bedoeld is om de leesbaarheid te verbeteren kun je er beter simpelweg <pre></pre> omheen zetten:
Code (php)
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
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
<?php
// output escaping
function escape($in) {
return htmlspecialchars($in, ENT_QUOTES, 'UTF-8');
}
// generieke dumpfunctie, je zou dit nog uit kunnen breiden met andere is_...() controles
function dump($in) {
if (is_array($in)) {
$in = print_r($in, true);
}
echo '<pre>'.escape($in).'</pre>';
}
// test array
$test = array(
'aap',
'hello' => 'world',
'html' => '<b>bold</b>',
4,
);
// output header
header('Content-Type: text/html; charset=UTF-8');
// dump gegevens
dump($test);
?>
// output escaping
function escape($in) {
return htmlspecialchars($in, ENT_QUOTES, 'UTF-8');
}
// generieke dumpfunctie, je zou dit nog uit kunnen breiden met andere is_...() controles
function dump($in) {
if (is_array($in)) {
$in = print_r($in, true);
}
echo '<pre>'.escape($in).'</pre>';
}
// test array
$test = array(
'aap',
'hello' => 'world',
'html' => '<b>bold</b>',
4,
);
// output header
header('Content-Type: text/html; charset=UTF-8');
// dump gegevens
dump($test);
?>
Zoals eerder aangegeven, de twee arrays zijn ook niet equivalent. De een bevat een aantal integers, de ander een aantal strings. Ook het aanpassen van het array waarbij de indruk wordt gewekt dat de inhoud andere types heeft lijkt mij op zijn zachtst gezegd misleidend.
Naar aanleiding van @AdFundums code hierboven: wat is het idee om hier nog de prefix '$arr2 = ...' aan toe te voegen? En met welk doel? Om dit te evalueren? Om PHP-code te genereren? Beide lijken mij verre van goede ideeën. Dit lijkt mij voortborduren op een slecht ontwerp. Misschien heb je met jouw reactie wel een antwoord gegeven op de vraag, maar tegelijkertijd stuur je iemand mogelijk compleet de verkeerde kant op.
Daarnaast zou je bij het geven van een "oplossing" ook rekening kunnen houden met een bredere inzetbaarheid van de aangeleverde code, en niet enkel iets aandragen dat weliswaar voor het gegeven voorbeeld werkt, maar in andere gevallen gewoon een verkeerd resultaat oplevert. Ik denk niet dat vragenstellers echt geholpen worden/zijn met ad hoc oplossingen.
Waar staat dat het om HTML gaat?
Waarom is de toevoeging $arrX = een voortburen op een slecht ontwerp, in dit geval van Ariën?
Hoezo wordt iemand de verkeerde kant op gestuurd als alleen de vraag beantwoord wordt?
Wat weet jij meer van de context, zonder het hier gevraagd te hebben?
Waarom moet het antwoord zo zijn dat het meer beantwoordt dan wat gevraagd wordt?
Ik zou denken dat als je serieus meer wilt weten over de context, dat je dat dan vraagt aan de vragensteller, in plaats van dat je anderen probeert af te troeven. Dat lijkt mij nou een goed idee.
Edit:
Popcorn-meme's zijn echt niet nodig. Laten we het gewoon gezellig houden, en bewaar die versnapering maar lekker voor bij een film :-).
Gewijzigd op 24/11/2020 10:51:45 door - Ariën -
Wil Yoeri nou code outputten, of wilt hij een array in het geheugen opslaan zonder indexen (wat dus niet kan)? Het is wel leuk dat er een draai aan is gegeven om dit in de code te outputten. Maar toch ben ik benieuwd naar Yoeri's reactie.