Dubbele array uit lijst verwijderen
Ik moet van de onderstaand array dubbele uit de lijst verwijderen. De bedoeling is dat de array Predator uit de lijst verwijderd worden omdat die predator-pl al voorkomt in EDM en 2 overig (BLUE en EDM) moeten blijven.
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
Array
(
[BLUE] => Array
(
[0] => blue-le
)
)
Array
(
[Predator] => Array
(
[0] => predator-pl
)
)
Array
(
[EDM] => Array
(
[0] => predator
[1] => predator-pl
[2] => punch
[3] => punch-bd
)
)
(
[BLUE] => Array
(
[0] => blue-le
)
)
Array
(
[Predator] => Array
(
[0] => predator-pl
)
)
Array
(
[EDM] => Array
(
[0] => predator
[1] => predator-pl
[2] => punch
[3] => punch-bd
)
)
Ik heb met diverse multidimensional arrays geprobeerd of eerst tellen welke array de hoogste is en .... kom ik niet meer verder uit.
Onderstaand is tellen hoeveel er aanwezig is in array.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
$count = array();
foreach($op as $id => $value) {
foreach($value as $sid => $svalue ) {
$tellen = count($svalue);
$count[$sid] = $tellen;
}
}
arsort($count);
Array
(
[EDM] => 4
[Predator] => 1
[BLUE] => 1
)
foreach($op as $id => $value) {
foreach($value as $sid => $svalue ) {
$tellen = count($svalue);
$count[$sid] = $tellen;
}
}
arsort($count);
Array
(
[EDM] => 4
[Predator] => 1
[BLUE] => 1
)
Kan er iemand mij oplossing bieden hoe ik het kan oplossen?
Gewijzigd op 10/12/2015 10:07:58 door Sander Corbesir
Wat is de logica om Predator[0] en Predator te verwijderen en niet EDM[1]?
De lijstje hierboven zijn allemaal bundels en als je EDM hebt..heeft die voorrang en moet al andere bundels die je hebt verwijderd worden als die in lijstje voorkomt. BLUE komt niet voor in EDM voor en die moet dus blijven.
Het klinkt een beetje alsof je items hebt die mogelijk in meerdere categorieën vallen, en je deze dan toch wilt toekennen aan slechts één categorie. Wat is dan de verdeelsleutel? Als deze categorieën een bepaalde vaste prioriteit hebben die niet afhangt van het aantal items, gebruik dit dan bij de opbouw.
Krijg je deze informatie zo aangeleverd, of bouw je deze lijsten zelf op?
Misschien kun je ook een toelichting geven wat deze informatie betekent, en wat je uiteindelijk probeert te bereiken?
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
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
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
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
<?php
$ar1 = array('BLUE' => array('blue-le'));
$ar2 = array('Predator' => array('predator-pl'));
$ar3 = array('EDM' => array('predator', 'predator-pl', 'punch', 'punch-bd'));
/* Het bovenstaande geeft de datastructuur uit je openingspost:
Array
(
[BLUE] => Array
(
[0] => blue-le
)
)
Array
(
[Predator] => Array
(
[0] => predator-pl
)
)
Array
(
[EDM] => Array
(
[0] => predator
[1] => predator-pl
[2] => punch
[3] => punch-bd
)
)
*/
// Alle data combineren tot één array:
$data = array_merge_recursive($ar1, $ar2, $ar3);
// Items per array tellen:
$counts = array();
foreach ($data as $key => $value) {
$counts[$key] = count($value);
}
// Aflopend sorteren:
arsort($counts);
/* Resultaat in $counts:
Array
(
[EDM] => 4
[Predator] => 1
[BLUE] => 1
)
*/
// Arrays recombineren met het aantal items:
$new_data = array();
$used_data = array();
foreach ($counts as $key => $value) {
// Gebruik de eerste array in zijn geheel:
if (count($used_data) == 0) {
$new_data[$key] = $data[$key];
$used_data = $data[$key];
} else {
// Gebruik anders alleen het verschil tussen nieuwe en gebruikte data:
$array_diff = array_diff($data[$key], $used_data);
if (count($array_diff) != 0) {
$new_data[$key] = $array_diff;
$used_data = array_merge($used_data, $array_diff);
}
}
}
/* Nieuwe datastructuur in $new_data:
Array
(
[EDM] => Array
(
[0] => predator
[1] => predator-pl
[2] => punch
[3] => punch-bd
)
[BLUE] => Array
(
[0] => blue-le
)
)
*/
?>
$ar1 = array('BLUE' => array('blue-le'));
$ar2 = array('Predator' => array('predator-pl'));
$ar3 = array('EDM' => array('predator', 'predator-pl', 'punch', 'punch-bd'));
/* Het bovenstaande geeft de datastructuur uit je openingspost:
Array
(
[BLUE] => Array
(
[0] => blue-le
)
)
Array
(
[Predator] => Array
(
[0] => predator-pl
)
)
Array
(
[EDM] => Array
(
[0] => predator
[1] => predator-pl
[2] => punch
[3] => punch-bd
)
)
*/
// Alle data combineren tot één array:
$data = array_merge_recursive($ar1, $ar2, $ar3);
// Items per array tellen:
$counts = array();
foreach ($data as $key => $value) {
$counts[$key] = count($value);
}
// Aflopend sorteren:
arsort($counts);
/* Resultaat in $counts:
Array
(
[EDM] => 4
[Predator] => 1
[BLUE] => 1
)
*/
// Arrays recombineren met het aantal items:
$new_data = array();
$used_data = array();
foreach ($counts as $key => $value) {
// Gebruik de eerste array in zijn geheel:
if (count($used_data) == 0) {
$new_data[$key] = $data[$key];
$used_data = $data[$key];
} else {
// Gebruik anders alleen het verschil tussen nieuwe en gebruikte data:
$array_diff = array_diff($data[$key], $used_data);
if (count($array_diff) != 0) {
$new_data[$key] = $array_diff;
$used_data = array_merge($used_data, $array_diff);
}
}
}
/* Nieuwe datastructuur in $new_data:
Array
(
[EDM] => Array
(
[0] => predator
[1] => predator-pl
[2] => punch
[3] => punch-bd
)
[BLUE] => Array
(
[0] => blue-le
)
)
*/
?>
Lang verhaal kort: ik gebruik hier array_diff() om verschillen tussen arrays te vinden en array_merge() om bij te houden welke data al gebruikt zijn.
Gewijzigd op 10/12/2015 13:35:43 door Ward van der Put
Bedankt Ward..hiermee is mijn probleem opgelost en werkt alles naar behoren zoals ik wilde.