Usuwanie kolorów z niedostępnymi rozmiarami

0

Witam, siedzę od kilku godzin nad problemem usuwania kolorów produktów, dla których wszystkie rozmiary są niedostępne.
Struktura danych wygląda mniej więcej tak: produkt ma dany kolor i rozmiary do niego przypisane, sam rozmiar przechowuje informację o jego dostępności. Teraz problem polega na tym, że chcę usunąć element tablicy kolorów, dla którego wszystkie rozmiary są niedostępne.

user image

Próbowałem coś takiego, ale nie działa:

foreach($products as $product) {
    $counter = 0;
    foreach($product['color'] as $color['size'] => $size) {
        if($size['availability'] == false) {
            $counter++;
        } 
        
        if($counter == count($product['color']))
        {
            unset($product['color']);
        }
    }
}

Przykładowa tablica:

$products = array(
    'produkt1' => array(
        'colors' => array(
            'niebieski' => array(
                'sizes' => array(
                    '31' => array(
                        'availability' => true,
                    ),
                    '32' => array(
                        'availability' => true,
                    )
                )
            ),
            'czerwony' => array(
                'sizes' => array(
                    '31' => array(
                        'availability' => false,
                    ),
                    '32' => array(
                        'availability' => false,
                    )
                )
            ),
        ),
    ),
    'produkt2' => array(
        'colors' => array(
            'niebieski' => array(
                'sizes' => array(
                    '31' => array(
                        'availability' => true,
                    ),
                    '32' => array(
                        'availability' => true,
                    )
                )
            ),
            'czerwony' => array(
                'sizes' => array(
                    '31' => array(
                        'availability' => false,
                    ),
                    '32' => array(
                        'availability' => false,
                    )
                )
            ),
        ),
    ),
);

Macie może jakiś pomysł jak w miarę elegancko rozwiązać ten problem?

0

Jeśli Cię dobrze zrozumiałem to ja bym to zrobił tak:

# najpierw tworzę tablicę kolorów, którę będą dostępnę w systemie (IMO pobierasz to z bazy)
$arrayOfColours = array('czerwony','niebieski'); 
 # za pomocą foreach'a nadpisuje tablicę products
foreach($products as &$product) {
	foreach($arrayOfColours as $color){
		if(($product['colors'][$color]['sizes'][31]['availability'] == false) && ($product['colors'][$color]['sizes'][32]['availability'] == false)){	
			// $product['colors'][$color] = array(); # ZWRACAM PUSTĄ TABLICA
			unset($product['colors'][$color]); # KASUJE TABLICĘ (Z TEGO CO ZROZUMIAŁEM Z TWOJEGO OPISU)
		}else{
			echo '<pre>';
			print_r('Produkt jest w magazynie, nie wykonuje żadnych operacji');
			echo '</pre>';
		}	
	}
}
echo '<pre>';
print_r($products);
echo '</pre>';
0

Tylko, że zakładasz, że będziemy mieli max dwa rozmiary lub ich stałą ilość.

Udało mi się zejść do poziomu kolorów, tzn. nie biorę już pod uwagę listy produktów, konkretnego produktu, a stąd już prosta droga.

Rozwiązanie dla potomnych:

Mam tablicę:

$colors = array(
            'niebieski' => array(
                'sizes' => array(
                    '31' => array(
                        'availability' => true,
                    ),
                    '32' => array(
                        'availability' => true,
                    )
                )
            ),
            'czerwony' => array(
                'sizes' => array(
                    '31' => array(
                        'availability' => false,
                    ),
                    '32' => array(
                        'availability' => false,
                    )
                )
            ),
        );
foreach($colors as $a => $color) {
    $counter = 0;
    foreach ($color['sizes'] as $size) {
        if($size['availability'] == false) {
            $counter++;
        } 
    }
    if($counter == count($color['sizes'])) {
        unset($colors[$a]);
    }
}

W wyniku dostaję tylko podtablicę koloru niebieskiego.

0

można też krócej, bardziej pro ;)

array_walk($colors, function(&$c){
	$c['sizes'] = array_filter($c['sizes'], function($s){
		return $s['availability'];
	});
});

$colors = array_filter($colors, function($s){
	return count($s['sizes']);
});

1 użytkowników online, w tym zalogowanych: 0, gości: 1