array_push associative array
Onderstaand heb ik een functie gemaakt die namen en functies in een array moet zetten.
Elke naam kan meerdere functies hebben.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
<?php
function addName( $firstname, $func ){
$names = array();
array_push ( $names[$firstname], $func );
print_r ($names);
}
addName( 'Stefan', 'manager' );
addName( 'Stefan', 'sales' );
addName( 'Bert', 'sales' );
?>
function addName( $firstname, $func ){
$names = array();
array_push ( $names[$firstname], $func );
print_r ($names);
}
addName( 'Stefan', 'manager' );
addName( 'Stefan', 'sales' );
addName( 'Bert', 'sales' );
?>
De print_r geeft de error WARNING array_push() expects parameter 1 to be array, null given on line number 3
Waarom geeft deze null aan terwijl deze gevuld is?
Dan is dit je oplossing:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?php
$names = [];
function addName($firstname,$func){
global $names;
if(!array_key_exists($firstname,$names)) $names[$firstname] = [];
$names[$firstname][] = $func; //dit kan ook met array_push()
}
addName('Stefan','manager');
addName('Stefan','sales');
addName('Bert','sales');
print_r($names);
?>
$names = [];
function addName($firstname,$func){
global $names;
if(!array_key_exists($firstname,$names)) $names[$firstname] = [];
$names[$firstname][] = $func; //dit kan ook met array_push()
}
addName('Stefan','manager');
addName('Stefan','sales');
addName('Bert','sales');
print_r($names);
?>
Gewijzigd op 14/04/2021 21:17:09 door Rob Doemaarwat
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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
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
39
40
41
42
43
44
45
<h3>Array</h3>
<?php
$names = [];
$Stefan = [ 'Stefan' => ['manager','sales'] ];
$Bert = [ 'Bert' => ['sales']];
$names = array_merge ( $names, $Stefan );
$names = array_merge ( $names, $Bert );
echo '<pre>' . print_r ( $names , TRUE ) . '</pre>';
$naam = 'Stefan';
echo '<p>De functie van <b>' . $naam . '</b> is <b>' . $names[ $naam ][0] . '</b>' . ( $names[ $naam ][1] <> '' ? ' en <b>' . $names[ $naam ][1] . '</b>' : '' ) . '.</p>';
$naam = 'Bert';
echo '<p>De functie van <b>' . $naam . '</b> is <b>' . $names[ $naam ][0] . '</b>' . ( $names[ $naam ][1] <> '' ? ' en <b>' . $names[ $naam ][1] . '</b>' : '' ) . '.</p>';
?>
<h3>Object</h3>
<?php
$personeel = new stdClass;
$Stefan = new stdClass;
$Stefan->functie = (object)['manager','sales'];
$Stefan->functieschaal = 10;
$Bert = new stdClass;
$Bert->functie = (object)['sales'];
$personeel->Stefan = $Stefan;
$personeel->Bert = $Bert;
echo '<pre>' . print_r( $personeel, TRUE ) . '</pre>';
$naam = 'Stefan';
echo '<p>De functie van <b>' . $naam . '</b> is <b>' . $personeel->{$naam}->functie->{0} . '</b> en heeft functieschaal <i>' . $personeel->{$naam}->functieschaal . '</i></p>';
$naam = 'Bert';
echo '<p>De functie van <b>' . $naam . '</b> is <b>' . $personeel->{$naam}->functie->{0} . '</b>' . ( $personeel->{$naam}->functieschaal <> '' ? ' en heeft functieschaal <i>' . $personeel->{$naam}->functieschaal . '</i>' : '' ) . '</p>';
?>
<?php
$names = [];
$Stefan = [ 'Stefan' => ['manager','sales'] ];
$Bert = [ 'Bert' => ['sales']];
$names = array_merge ( $names, $Stefan );
$names = array_merge ( $names, $Bert );
echo '<pre>' . print_r ( $names , TRUE ) . '</pre>';
$naam = 'Stefan';
echo '<p>De functie van <b>' . $naam . '</b> is <b>' . $names[ $naam ][0] . '</b>' . ( $names[ $naam ][1] <> '' ? ' en <b>' . $names[ $naam ][1] . '</b>' : '' ) . '.</p>';
$naam = 'Bert';
echo '<p>De functie van <b>' . $naam . '</b> is <b>' . $names[ $naam ][0] . '</b>' . ( $names[ $naam ][1] <> '' ? ' en <b>' . $names[ $naam ][1] . '</b>' : '' ) . '.</p>';
?>
<h3>Object</h3>
<?php
$personeel = new stdClass;
$Stefan = new stdClass;
$Stefan->functie = (object)['manager','sales'];
$Stefan->functieschaal = 10;
$Bert = new stdClass;
$Bert->functie = (object)['sales'];
$personeel->Stefan = $Stefan;
$personeel->Bert = $Bert;
echo '<pre>' . print_r( $personeel, TRUE ) . '</pre>';
$naam = 'Stefan';
echo '<p>De functie van <b>' . $naam . '</b> is <b>' . $personeel->{$naam}->functie->{0} . '</b> en heeft functieschaal <i>' . $personeel->{$naam}->functieschaal . '</i></p>';
$naam = 'Bert';
echo '<p>De functie van <b>' . $naam . '</b> is <b>' . $personeel->{$naam}->functie->{0} . '</b>' . ( $personeel->{$naam}->functieschaal <> '' ? ' en heeft functieschaal <i>' . $personeel->{$naam}->functieschaal . '</i>' : '' ) . '</p>';
?>
Gewijzigd op 14/04/2021 22:07:12 door Adoptive Solution
Huh, heeft PHP toch een object als native type om naar te casten?
Wat heb ik gemist, is dat nieuw in PHP8 of kan je dat ook al in 7 gebruiken?
Aanvulling: https://www.php.net/manual/en/language.types.object.php
Maar toch gek, ik heb eerder gelezen dat er geen basistype was van een object waarvan je kan extenden.
Nog een aavulling: ik denk dat ik het actief heb genegeerd dat het kan, omdat ik meer een C++ -achtige manier van gebruik van objecten nastreef, omdat ik het nut niet direct inzag. Meestal als je objecten gebruikt als data, ga je het op een gegeven moment omkeren met Reflection en voor je het weet is de performance naatje.
Toch bedankt voor dit codevoorbeeld dat me voorhoudt dat het soms ook anders kan.