[PHP] 2 arrays bij elkaar optellen (a la grid)

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • om3ega
  • Registratie: Maart 2001
  • Laatst online: 18-09 14:15
Beste tweakers,

ik heb een probleem waar ik zo 1..2..3. even niet uit kom.

Stel ik heb 2 grids (2 layers)

layer 1

1234
1
21
31
4


en

1234
1
2
3
411


Deze waardes per layer staan opgeslagen in een array :

PHP:
1
2
3
4
5
6
7
//X = 2 , Y = 2 --> value 1
//X = 2 , Y = 3 --> value 1
$layer1 =  Array (2 =>array(2=>1,3=>1));

//X = 1 , Y = 4 --> value 1
//X = 2 , Y = 4 --> value 1
$layer2 =  Array (1 =>array(4=>1),2 =>array(4=>1));


Individueel werken de grids perfect.
Maar nu wil ik deze layers samenvoegen tot 1 layer..

PHP:
1
$field = $layer1+$layer2;


en nu gebeurd er iets vreemds.

---> Result

1234
1
2 1
3 1
41


Mijn verwachting zou zijn dat x,y -> 2,4 ook 1 zou zijn.
Maar dat is hij niet.


Var dump van $field

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Array
(
    [2] => Array
        (
            [2] => 1
            [3] => 1
        )

    [1] => Array
        (
            [4] => 1
        )

)


Zie ik iets over het hoofd? Ik heb ook gekeken naar de functies : array_ merge_ recursive en array_ merge maar deze geven niet het gewenst resultaat.

Kan het geen wat ik wil eigenlijk wel met een array? Of misbruik ik het nu een beetje?

Acties:
  • 0 Henk 'm!

  • MueR
  • Registratie: Januari 2004
  • Laatst online: 01:20

MueR

Admin Tweakers Discord

is niet lief

Je kan arrays niet zomaar bij elkaar optellen. Daar is array_merge voor uitgevonden.

Anyone who gets in between me and my morning coffee should be insecure.


Acties:
  • 0 Henk 'm!

Verwijderd

om3ega schreef op dinsdag 26 januari 2010 @ 13:54:[...]
PHP:
1
$field = $layer1+$layer2;
Je kan twee niet zo bij elkaar optellen in php. ;) Wat je hier doet is de vereniging nemen van de twee arrays: http://nl3.php.net/manual/en/language.operators.array.php.
Zie ik iets over het hoofd? Ik heb ook gekeken naar de functies : array_ merge_ recursive en array_ merge maar deze geven niet het gewenst resultaat.
Heb je gekeken naar wat deze functies doen in php? Ze namelijk niet alle waarden van elke array af om die vervolgens bij elkaar op te tellen.. :P
Kan het geen wat ik wil eigenlijk wel met een array? Of misbruik ik het nu een beetje?
Wat je wil kan zeker. Je zou voor het optellen van de twee grids een eigen functie kunnen schrijven. Heb je ervaring met for-loops? :)

[ Voor 7% gewijzigd door Verwijderd op 26-01-2010 14:06 . Reden: Informatie toegevoegd over + bij arrays ]


Acties:
  • 0 Henk 'm!

  • wackmaniac
  • Registratie: Februari 2004
  • Laatst online: 18:02
Welbeschouwd heb nu je ook geen grids, maar twee 2-dimensionale arrays die een aantal indices missen.

Read the code, write the code, be the code!


Acties:
  • 0 Henk 'm!

  • MueR
  • Registratie: Januari 2004
  • Laatst online: 01:20

MueR

Admin Tweakers Discord

is niet lief

MueR schreef op dinsdag 26 januari 2010 @ 14:03:
Je kan arrays niet zomaar bij elkaar optellen. Daar is array_merge voor uitgevonden.
Hmm, dus niet..
If the input arrays have the same string keys, then the later value for that key will overwrite the previous one. If, however, the arrays contain numeric keys, the later value will not overwrite the original value, but will be appended.
Met andere woorden, je zult een stuk code moeten schrijven om over je arrays heen te loopen en die zelf te mergen tot 1.

Anyone who gets in between me and my morning coffee should be insecure.


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Verwijderd schreef op dinsdag 26 januari 2010 @ 14:03:
[...]

Je kan twee niet zo bij elkaar optellen in php. ;) Wat je hier doet is de vereniging nemen van de twee arrays: http://nl3.php.net/manual/en/language.operators.array.php.
Je linkt nu nota bene wel naar een pagina waar staat dat het wél kan. De reden dat het hier niet kan is dat PHP naar mijn weten geen multidimensionale arrays op die manier kan verenigen. Daar gaat de functie die MueR hierboven aanhaalde overigens ook niet bij helpen. Deze wel. ;)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • om3ega
  • Registratie: Maart 2001
  • Laatst online: 18-09 14:15
Bedankt allemaal, ik ga nog eens even kijken naar de merge optie van php (merge_recursive) ..

En anders iets om zelf door de results heen te gaan loopen :)

Acties:
  • 0 Henk 'm!

Verwijderd

NMe schreef op dinsdag 26 januari 2010 @ 14:09:
[...]

Je linkt nu nota bene wel naar een pagina waar staat dat het wél kan. De reden dat het hier niet kan is dat PHP naar mijn weten geen multidimensionale arrays op die manier kan verenigen. Daar gaat de functie die MueR hierboven aanhaalde overigens ook niet bij helpen. Deze wel. ;)
Ho ho. :P Ik vermeld dat wat hij doet de vereniging nemen is van twee arrays en link vervolgens naar de uitleg pagina over wat dat is. :> Vereniging != optellen! :+ Op de een of andere manier zat in mijn hoofd dat als er in beide grids een 1 staat op een plaats dat dit dan ook opgeteld moest worden. Geen idee hoe ik daar bij kom. Ik denk door de gequote code. :P

Maar array_merge_recursive gaat hier ook niet naar voldoening werken gok ik. Want die zal als er in grid A en grid B een 1 staat op dezelfde plaats op die plaats ook weer een multi-dimensionale array aanmaken.

Acties:
  • 0 Henk 'm!

  • om3ega
  • Registratie: Maart 2001
  • Laatst online: 18-09 14:15
Verwijderd schreef op dinsdag 26 januari 2010 @ 14:21:
[...]
Maar array_merge_recursive gaat hier ook niet naar voldoening werken gok ik. Want die zal als er in grid A en grid B een 1 staat op dezelfde plaats op die plaats ook weer een multi-dimensionale array aanmaken.
Het werkt inderdaad niet.

Met

PHP:
1
$field = array_merge_recursive($layer1 , $layer2);


Krijg ik hetzelfde resultaat terug als layer-2

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Array
(
    [0] => Array
        (
            [2] => 1
            [3] => 1
        )

    [1] => Array
        (
            [4] => 1
        )

    [2] => Array
        (
            [4] => 1
        )

)


De andere twee "1-nen" van layer 1 worden in array(0) gezet..

Voor het gemak zet ik maar even de sourcecode online, mocht iemand de resultaten willen simuleren.

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
46
47
48
49
50
51
52
<?php

//4x4
$x = 4;
$y = 4;

//counters
$xx =1;
$yy =1;

//X = 2 , Y = 2 --> value 1
//X = 2 , Y = 3 --> value 1
$layer1 =  Array (2 =>array(2=>1,3=>1));

//X = 1 , Y = 4 --> value 1
//X = 2 , Y = 4 --> value 1
$layer2 =  Array (1 =>array(4=>1),2 =>array(4=>1));

//$field = $layer2;
//$field = $layer1+$layer2;

$field = array_merge_recursive($layer1 , $layer2);
//Draw Table according to array.
echo "<table border='5' cellspacing='3' cellpadding='3'>";
echo "<th> </th>";
while ($xx <= $x) {
echo "<th>".$xx."</th>";
$xx++;
}
//Reset xx
$xx = 1;

while ($yy <= $y) {
    echo "<tr>";
    echo "<th>".$yy."</th>"; 
        while ($xx <= $x) {
            if ($field[$xx][$yy] ) { echo "<td>1</td>"; } else { echo "<td>0</td>"; }
            $xx++;
        }
    echo "</tr>";
    //Reset xx
    $xx = 1;
    $yy++;
}
echo "</tr>";
echo "</table>";

echo "<pre>";
print_r($field);
echo "</pre>";

?>

[ Voor 39% gewijzigd door om3ega op 26-01-2010 14:27 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Aha!

- Je weet al hoe je langs alle waarden van de array moet loopen.
- Je weet al hoe je kan checken of op een bepaalde plaats in de array (jouw grid) een waarde staat. (Al vind ik het zelf netter om daar isset voor te gebruiken.)

Dan kan het toch niet heel lastig zijn om een functie te maken die exact doet wat jij wil? :)

Acties:
  • 0 Henk 'm!

  • om3ega
  • Registratie: Maart 2001
  • Laatst online: 18-09 14:15
Verwijderd schreef op dinsdag 26 januari 2010 @ 14:32:
Aha!

- Je weet al hoe je langs alle waarden van de array moet loopen.
- Je weet al hoe je kan checken of op een bepaalde plaats in de array (jouw grid) een waarde staat. (Al vind ik het zelf netter om daar isset voor te gebruiken.)

Dan kan het toch niet heel lastig zijn om een functie te maken die exact doet wat jij wil? :)
Waarschijnlijk moet ik gewoon even op een andere manier denken. Het is jammer dat het optellen niet werkt. Het kwam wel het dichts in de buurt van wat ik wilde :)

Overigens is mijn doel niet het weergeven van de arrays in een grid , maar het samenvoegen in 1 array. Het grid was gewoon even ter visualisatie :)

Acties:
  • 0 Henk 'm!

Verwijderd

Ik weet niet of dit voorbeeld representatief is voor de arrays die je daadwerkelijk wil gaan samenvoegen, maar het voordeel van een zelf gebouwde functie is natuurlijk dat je de boel makkelijk uitbreiden/ombouwen naar je eigen behoeftes. :)

Hint: $field[$xx][$yy] = 1 als $layer1[$xx][$yy] is 1 of $layer2[$xx][$yy] is 1.

Acties:
  • 0 Henk 'm!

  • om3ega
  • Registratie: Maart 2001
  • Laatst online: 18-09 14:15
Verwijderd schreef op dinsdag 26 januari 2010 @ 14:41:
Ik weet niet of dit voorbeeld representatief is voor de arrays die je daadwerkelijk wil gaan samenvoegen, maar het voordeel van een zelf gebouwde functie is natuurlijk dat je de boel makkelijk uitbreiden/ombouwen naar je eigen behoeftes. :)

Hint: $field[$xx][$yy] = 1 als $layer1[$xx][$yy] is 1 of $layer2[$xx][$yy] is 1.
Hmm.

zo simpel dat ik het over het hoofd zag :)
Tnx

PHP:
1
if($layer1[$xx][$yy] ==1 || $layer2[$xx][$yy] ==1) { $field[$xx][$yy] =1;}


Gewoon in de loop ter plekke de array opbouwen inderdaad :)

_/-\o_

Acties:
  • 0 Henk 'm!

  • Matis
  • Registratie: Januari 2007
  • Laatst online: 00:16

Matis

Rubber Rocket

Zou de waarde 1 niet als true evalueren in php?

If money talks then I'm a mime
If time is money then I'm out of time


Acties:
  • 0 Henk 'm!

  • om3ega
  • Registratie: Maart 2001
  • Laatst online: 18-09 14:15
Matis schreef op dinsdag 26 januari 2010 @ 14:47:
Zou de waarde 1 niet als true evalueren in php?
Ja , dat is wel mooier inderdaad..
Zal ik nog even aanpassen.

Acties:
  • 0 Henk 'm!

  • Matis
  • Registratie: Januari 2007
  • Laatst online: 00:16

Matis

Rubber Rocket

When converting to boolean, the following values are considered FALSE:

the boolean FALSE itself
the integer 0 (zero)
the float 0.0 (zero)
the empty string, and the string "0"
an array with zero elements
an object with zero member variables (PHP 4 only)
the special type NULL (including unset variables)
SimpleXML objects created from empty tags
Every other value is considered TRUE (including any resource).
Ja dus :P

If money talks then I'm a mime
If time is money then I'm out of time


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Dat maakt het IMO nog niet mooi om die vergelijking verder maar achterwege te laten. Dit is enigszins persoonlijk maar als ik integers vergelijk dan vergelijk ik integers. Dat die integer toevallig naar true evalueert doet daar niet aan af. :)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • Matis
  • Registratie: Januari 2007
  • Laatst online: 00:16

Matis

Rubber Rocket

NMe schreef op dinsdag 26 januari 2010 @ 14:55:
Dat maakt het IMO nog niet mooi om die vergelijking verder maar achterwege te laten. Dit is enigszins persoonlijk maar als ik integers vergelijk dan vergelijk ik integers. Dat die integer toevallig naar true evalueert doet daar niet aan af. :)
Ik heb ook nooit aangegeven dat ik het mooi vind/vond. Ik stelde alleen mezelf (en daarmee ook de TS) de vraag of dat die waarde niet naar true evalueert.

Ik vind ook niet dat je peren met appels moet vergelijken, maar het zou (misschien) een optimalisatie kunnen zijn.

If money talks then I'm a mime
If time is money then I'm out of time


Acties:
  • 0 Henk 'm!

Verwijderd

En het zou eigenlijk ook nog netjes zijn om te kijken of er uberhaupt een waarde is gezet (isset) op die plaats in de array. Op mijn devbak staat E_NOTICE aan in de php.ini en dan krijg je dus een scherm vol met dit soort meldingen. :9
code:
1
Notice:  Undefined offset:  10 in ...test3.php on line 18
Pagina: 1