Hallo,

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.

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
        )

)

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.

        $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
)

Kan er iemand mij oplossing bieden hoe ik het kan oplossen?
Wat is de logica om Predator[0] en Predator te verwijderen en niet EDM[1]?
EDM heeft voorrang omdat die meeste bundels heeft.

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.
Is dat dan niet een beetje een kip-ei situatie? Als de algemene regel is dat de langste/een langere lijst bepaalt waar een item in moet staan, dan is dit pas na afloop bekend. En wat nu als twee lijsten even lang zijn?

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?

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

    )

*/
?>


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.
Bedankt Ward..hiermee is mijn probleem opgelost en werkt alles naar behoren zoals ik wilde.

Reageren