Explode naar simpele array

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Yoeri Achterbergen

Yoeri Achterbergen

18/11/2020 13:52:32
Quote Anchor link
Hoi Hoi,


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?

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
<?php
//explode output standaard
Array ( [0] => 123 [1] => 456 [2] => 789 );


//de output die ik graag zou krijgen
Array ( '123',  '456', '789');
?>
 
PHP hulp

PHP hulp

19/03/2024 11:25:52
 
- Ariën  -
Beheerder

- Ariën -

18/11/2020 13:58:36
Quote Anchor link
In beide gevallen komt het er associatief uit. Zo werken array's nu eenmaal.

https://3v4l.org/clWM0
Gewijzigd op 18/11/2020 13:59:03 door - Ariën -
 
Thomas van den Heuvel

Thomas van den Heuvel

18/11/2020 14:32:19
Quote Anchor link
Alle arrays worden geïndexeerd. Wanneer je niet expliciet een index aangeeft, wordt er vanaf 0 genummerd.

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().
 
Ad Fundum

Ad Fundum

18/11/2020 15:15:24
Quote Anchor link
Als uitvoer kan het zo:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
<?php
$arr1
= Array ( 0 => 123, 1 => 456, 2 => 789 );
print '$arr2 = Array ( \'' . implode('\', \'', $arr1) . '\' );';
?>

Resultaat:
$arr2 = Array ( '123', '456', '789' );
Gewijzigd op 18/11/2020 15:16:22 door Ad Fundum
 
Thomas van den Heuvel

Thomas van den Heuvel

18/11/2020 16:06:59
Quote Anchor link
Klopt dat nog als $arr1 leeg is?
 
Ad Fundum

Ad Fundum

20/11/2020 09:44:46
Quote Anchor link
$arr1 is niet leeg, zie regel 2.
 
- Ariën  -
Beheerder

- Ariën -

20/11/2020 10:01:24
Quote Anchor link
Volgens mij gaat er volgens Thomas om dat 'áls $arr1 leeg is'. Ik heb het idee dat hij bedoelt dat je in dat geval een lege array moet ziet.
Gewijzigd op 20/11/2020 10:02:09 door - Ariën -
 
Ad Fundum

Ad Fundum

20/11/2020 10:09:54
Quote Anchor link
Als $arr1 leeg is heeft Youri geen probleem, een lege associatieve array heeft geen indexes.
Ik begrijp dan ook niet helemaal waarom Thomas dit aanhaalt?
Gewijzigd op 20/11/2020 10:10:32 door Ad Fundum
 
- Ariën  -
Beheerder

- Ariën -

20/11/2020 10:30:18
Quote Anchor link
Bijna goed:
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:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
$arr2
= Array ( '' );
?>

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 -
 
Thomas van den Heuvel

Thomas van den Heuvel

20/11/2020 15:38:23
Quote Anchor link
Een implode op een leeg array is volgens mij prima toegestaan?

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)?
 
Ad Fundum

Ad Fundum

23/11/2020 13:43:43
Quote Anchor link
Ik denk dat jullie de discussie op een zijspoor zetten.

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)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
<?php
$arr1
= [];
echo (count($arr1) > 0) ? '$arr2 = Array ( \'' . implode('\', \'', $arr1) . '\' );' : '$arr2 = Array ();';
?>


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.
 
Thomas van den Heuvel

Thomas van den Heuvel

23/11/2020 17:18:05
Quote Anchor link
Bruh.

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)
PHP script in nieuw venster Selecteer het PHP script
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
<?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);
?>


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.
 
Ad Fundum

Ad Fundum

24/11/2020 08:59:46
Quote Anchor link
Je maakt het er niet leuker op door op voorhand iedereen te diskwalificeren op basis van eigen aannames ("gaat niet ver genoeg", "misleidend", "slecht ontwerp", "niet wenselijk") zonder verdere uitleg.

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.
 
Ozzie PHP

Ozzie PHP

24/11/2020 10:25:52
Quote Anchor link
** knip **

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 -
 
- Ariën  -
Beheerder

- Ariën -

24/11/2020 17:02:41
Quote Anchor link
De vraag is:

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.
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.