Array key direct aan andere array met key toekennen

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Ozzie PHP

Ozzie PHP

23/03/2014 23:57:50
Quote Anchor link
Hello,

Als ik een array heb, en ik wil aan een array key direct een andere array met key toekennen, dan kan ik dit doen, en het werkt gewoon prima:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
<?php
$array
= array();
$array['foo']['bar'][] = 'hoi';
?>

Wel vraag ik me af of dit juist is? Zou ik eigenlijk eerst moeten aangeven dat 'foo' en 'bar' arrays zijn? Of is dat niet nodig omdat $array al een array is? Dit is wat ik bedoel:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
<?php
$array
= array();
$array['foo'] = array();
$array['foo']['bar'] = array();
$array['foo']['bar'][] = 'hoi';
?>

Of is dit niet nodig? Beide varianten werken prima, maar ik vraag me dus af of je binnen een array ook moet aangeven of het een array is, of dat je direct sub-keys mag toekennen. Iemand die dit weet?

- Aar -:
Gezien de wereld van array's erg breed is, zou het niet misstaan om een duidelijkere titel voor dit topic te gebruiken. Ik heb deze alvast voor je aangepast (was: 'array').
Zou je er voortaan zelf op willen letten?
Alvast bedankt!
Gewijzigd op 24/03/2014 00:16:29 door - Ariën -
 
PHP hulp

PHP hulp

25/04/2024 22:50:52
 
Ivo P

Ivo P

24/03/2014 00:09:27
Quote Anchor link
zelfs zonder regel 2 werkt het.
 
Ozzie PHP

Ozzie PHP

24/03/2014 03:03:28
Quote Anchor link
Wat ik meer bedoel is dit. Stel we hebben een array $array.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
[0]
    [0] => 'welkom'
    [1] => 'hallo'
[1]
    [0] => 'welkom'
    [1] => 'dag


Nu wil ik dit doen:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
<?php

$new_array
= array();

foreach ($array as $element) {
    $new_array[$element[0]]['say_what'][] = $element[1];
}


?>

De bedoeling is dat $new_array er dan als volgt uitziet:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
[welkom]
    [say_what]
        [0] => 'hallo'
        [1] => 'dag'

Maar is het een juiste manier om in de foreach-loop direct die keys toe te wijzen op deze manier:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
$new_array
[$element[0]]['say_what'][] = $element[1];
?>

Of is het meer de bedoeling dat je in de foreach-loop zoiets gaat doen??

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
<?php
if (!isset($new_array[$element[0]])) {
  $new_array[$element[0]] = array();
  $new_array[$element[0]]['say_what'] = array();
}

$new_array[$element[0]]['say_what'][] = $element[1];
?>


@Aar:

Mijn excuses, dat was inderdaad een vrij karige titel die er even tussendoor is geslipt. Mea culpa!
 
Ward van der Put
Moderator

Ward van der Put

24/03/2014 08:05:52
Quote Anchor link
>> Zou ik eigenlijk eerst moeten aangeven dat 'foo' en 'bar' arrays zijn? Of is dat niet nodig omdat $array al een array is?

Het kan gewoon kortweg zo:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
<?php
$configuration
['database']['host']     = 'localhost';
$configuration['database']['username'] = 'root';
$configuration['database']['password'] = 'df3578GY8n47LG';
?>

Hier besparen we dus twee keer op een lege = array() declaratie:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
<?php
$configuration
= array();
$configuration['database'] = array();
$configuration['database']['host']     = 'localhost';
$configuration['database']['username'] = 'root';
$configuration['database']['password'] = 'df34?578GY8n427LG';
?>

Een foreach zou ik vooral in de vrij letterlijke betekenis for each gebruiken: als je een array wilt doorlopen en daarin elk element een bepaalde behandeling wilt geven. In overige gevallen is een isset(), een array_key_exists() of een while vaak zowel logischer als efficiënter.
 
Ozzie PHP

Ozzie PHP

24/03/2014 09:42:12
Quote Anchor link
Hoi Ward,

Dankjewel voor je reactie.

Ben ik als laatste nog even benieuwd... declareer jij dan ook geen array voordat je een loop in gaat?

Ik doe altijd dit:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
<?php
$new_array
= array(); // hier declareer ik een lege array
foreach ($some_array as $element) {
  $new_array[] = $element[3];
}

?>

Ik weet dat veel mensen dit doen (eerst een lege array declareren). Het zou zelfs kunnen zijn dat ik het hier geleerd heb. En sindsdien doe ik het zelf ook maar. Maar is dat dan eigenlijk overbodig?
Gewijzigd op 24/03/2014 09:43:03 door Ozzie PHP
 
Ward van der Put
Moderator

Ward van der Put

24/03/2014 09:59:46
Quote Anchor link
Dat doe ik inderdaad liever niet, want het heeft geen zin alvast een datastructuur aan te leggen als dat later ook nog kan. Dat is dubbelop en legt onnodig beslag op de parser en op geheugen.

Wat ik daarom ook niet doe, is zoiets:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
<?php
class Foo
{
    private $data = array();
}

?>

Daarvoor zijn grofweg vier redenen aan te voeren:

• Je declareert lege integers, booleans, enzovoort ook niet, dus waarom dan wel een lege array declareren? Dat is niet consistent.

• In PHPDoc kun je met @type datatypen van alle properties aangeven. Dat kan voor integers, booleans, enzovoort, dus doe je dat ook voor arrays. Dat is wél consistent.

• Misschien wordt die array helemaal niet altijd gebruikt, dus waarom dan alvast een array aanleggen?

• Misschien is $data wel een meerdimensionale array, maar dat komt toch niet tot uitdrukking met een enkele $data = array(). De datastructuur is dan incompleet en het is half werk.

In meerdere opzichten vind ik het beter om het dan zo te doen:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
<?php
class Foo
{
    /** @type array $data Data container for Foo-lish stuff. */
    private $data;
}

?>
 
Ozzie PHP

Ozzie PHP

24/03/2014 10:19:12
Quote Anchor link
Da's interessant Ward. En er zit zeker een kern van waarheid in.

De enige situatie die ik me zo kan bedenken waarin dat niet opgaat is deze:

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
<?php

class A {

    private $data;

    public function __construct() {
        $foo = ['foo'];
        $this->data = array_merge($this->data, $foo);
        var_dump($this->data);
    }

}


$a = new A;

?>

Nu krijg je een warning en $this->data zal NULL zijn.

Voor de rest met je eens. En inderdaad als je het zo bekijkt... waarom zou je een lege array declareren. Het geeft ook geen enkele foutmelding als je het niet doet.
Gewijzigd op 24/03/2014 10:19:28 door Ozzie PHP
 
Ward van der Put
Moderator

Ward van der Put

24/03/2014 10:30:50
Quote Anchor link
Als je het netjes doet, geef je die private $data dan een eigen setter: die bepaalt vervolgens de interne datastructuur van de array.
 
Ozzie PHP

Ozzie PHP

24/03/2014 10:44:37
Quote Anchor link
Maar je kunt wel eens een class als deze hebben:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
<?php

class Foo {

  private $data;

  function
add($data) {
      $this->data = array_merge($this->data, $data);
  }

}


?>

Hoe zorg jij er hier dan voor dat $this->data een array is?
 
Ward van der Put
Moderator

Ward van der Put

24/03/2014 10:58:07
Quote Anchor link
Akkoord, add() betekent nadrukkelijk "toevoegen", dus dat impliceert dan inderdaad dat er al een array is.

Vraag wordt dan: wil je "zomaar" twee arrays mergen of is er meer aan de hand en moet $this->data aan een bepaalde datastructuur voldoen? Meestal het tweede, dus dan wil je (a) elders toch een setter hebben en (b) de methode add() uitbreiden met controles voor die datastructuur.
 
Ozzie PHP

Ozzie PHP

24/03/2014 11:04:23
Quote Anchor link
>> en moet $this->data aan een bepaalde datastructuur voldoen?

Nee, wat ik in dit voorbeeld bedoel is dat je simpelweg data kunt toevoegen aan het object.

Stel je hebt een class Paths en daar wil je een array met paden aan toevoegen. De class-property $paths is dan in 1e instantie leeg (er zijn nog geen paden toegevoegd). Via de add functie kun je een array met paden (of zoals in het voorbeeld hierboven 'data') toevoegen aan de class property. Maar voordat je iets toevoegt, zal die class property een array moeten zijn, anders gaat het fout. Direct declareren, dus zo:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
<?php

    private $data = [];

?>

... lijkt mij dan het handigst. Denk je niet?
Gewijzigd op 24/03/2014 11:05:00 door Ozzie PHP
 
Ward van der Put
Moderator

Ward van der Put

24/03/2014 11:13:10
Quote Anchor link
Ja, direct declareren lijkt me dan het handigst.

Overigens, om misverstanden te voorkomen, ben ik niet tegen het declareren van properties. Het hangt immers helemaal af van wat je daarmee wilt doen. Er zijn situaties waarin het juist heel gewenst kan zijn, bijvoorbeeld:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
<?php
class User
{
    private $is_admin = false;
}

?>
 
Ozzie PHP

Ozzie PHP

24/03/2014 11:25:54
Quote Anchor link
Ja klopt. Ik snap je punt. Jouw stelling is dat het "onzinnig" / onnodig is om lege arrays te declareren, omdat je dat met andere data-types ook niet doet. En daar heb je wel gelijk in vind ik.
 



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.