Dizi değerlerinin geçerli kombinasyonları göstermek için PHP yineleme işlevi

3 Cevap php

Şöyle bir PHP dizi var:

Array
(
[340] => Array
    (
        [1] => 1
        [2] => 18
        [3] => 23
    )

[341] => Array
    (
        [1] => 1
        [2] => 17
        [3] => 23
    )

[342] => Array
    (
        [1] => 1
        [2] => 16
        [3] => 23
    )

[343] => Array
)

Dizi daha aslında ve yaklaşık 40 öğelerini içerir. Alt öğeleri farklı sayıda içeren diğer diziler olacak. Dizi olarak biçimlendirilmiş

productID => array (
    $attributeID => attributeValueID,
    $attributeID => attributeValueID,
    $attributeID => attributeValueID
)

Ne yapmam gerekiyor, diğer tüm nitelikler için geçerli değerleri gösterir bir dizidir. Çıktı dizisi kudreti gibi bir şey görünüyor

Array
(
18 => array(
    1 => array(
        11, 12, 13, 14, 15
    )
    2 => array(
        19, 20, 21, 22
    )
)
19 => array(
    1 => array(
        11, 13, 14, 15
    )
    2 => array(
        21, 22
    )
)

Bu dizinin formatı

attributeValueID => array(
    attributeID => attributeValues,
    attributeID => attributeValues
)

Bazı özyineleme fonksiyonları ile çalışıyoruz ama ben sadece ne gerek değil tüm değerleri arasındaki olası her kombinasyon bir listesini almak mümkün oldum. Herhangi bir yardım büyük mutluluk duyacağız.

Ben "geçerli" değerler demek ne Açıklama: Ne 1, 2, ve 3 değerleri burada temsil renk, boyut ve uzunluğu vardır. Burada nihai hedefi bir kullanıcı değerleri seçtiğinde sayfadaki seçenekleri güncellemek için kullanacağız javascript diziler bir dizi oluşturmaktır. Onlar siyah rengi seçin Örneğin siyah mevcut sadece boyutları ve uzunlukları yansıtmak için sayfa boyutları ve uzunlukları güncellemeniz gerekir. Ben elle diziler oluşturabilirsiniz ama bu iyi bir çözüm değildir.

3 Cevap

Id, renk, boyut ve uzunluğu, siz temsil: Ben şu anda o olsun, Tamam, dört özelliklere sahip ürünler var

[product_id] => array (
    1 => [color_id],
    2 => [size_id],
    3 => [length_id]
)

Şahsen, ben bu yapı biraz hantal buluyorum. Bu ürünün bir özelliği olduğu için ürün kimliği, dizinin içinde olmalıdır. Ayrıca, indeks numaraları yerine özellik adları kullanarak, anlamak için ürün zorlaştırır.

Şimdi, ne yapmak istiyorum, örneğin, özniteliklerin birinin tüm olası kombinasyonları buluyorum kullanıcı örn color_id seçer tüm size_id ve length_id siyah.

Bir bulucu yöntemi ile bunu yapabilir:

function findCombinationsByColorId($color_id, $products)
{
    $combos = array($color_id => array(
        'sizes'   => array(),
        'lengths' => array(),
        'products' => array()
    ));

    foreach($products as $productId => $product)
    {
         if($product[1] === $color_id) {
             $combos['sizes'][]    = $product[2];
             $combos['lengths'][]  = $product[3];
             $combos['products'][] = $productId;
         }
    }   
    return $combos;
}

Siyah ve siyah için tüm kombinasyonları bulmak için gerektiğinde Şimdi, 0 color_id, sen yapardın findCombinationsByColorId(0, $productArray) ve bu renk için mümkün olan tüm boyutları, uzunlukları ve ürün kimlikleri tutan bir dizi dönecekti.

Siz, diğer özelliklere göre kombinasyonları almak için ek işlevler yazardım. Sen bulucu yöntem genel yapabilir, ama ben nasıl anlamaya size bırakıyorum.

Eğer tüm dizi düzeyde bu sıralama neden Ne olsun dont. Ben, örneğin, bir yerden olası ürün almak varsayalım Bir veritabanı. Peki neden oradan tarak almak değil. Muhtemelen SELECT size_id, length_id, product_id from products where color_id = 0 kadar kolay olurdu.

Çıkışını varsayarak aslında olmalıdır:

attributeValueID => array(
    attributeID => productID,
    attributeID => productID
)

(Değilse nerede öznitelik değerleri geliyor?)

Özyineleme, dizi yeniden jig bu çizgiler boyunca sadece gerekli bir şey olmaz:

$products = array(   340 => array(
    								1 => 1,
    								2 => 18,
    								3 => 23
    								),

    					341 => array(
    						        1 => 1,
    						        2 => 17,
    						        3 => 23
    							    ),

    					342 => array(
    						        1 => 1,
    						        2 => 16,
    						        3 => 23
    							    ),

    					343 => array()
    				);
$output = array();

foreach($products as $product_id=>$attributes){
    $attribute_id;
    foreach($attributes as $attribute_id=>$attribute_value){
    	$output[$attribute_value][$attribute_id][] = $product_id;
    }

    // optionaly filter for dup product ids
    //$output[$attribute_value][$attribute_id] = array_unique($output[$attribute_value][$attribute_id], SORT_NUMERIC);
}

Gordon verilen cevabı ben arıyorum ne yakın ama benim ilk dizi biçimlendirilmiş şekilde verilen çok verimli değildir. Ben neden şimdi hatırlamıyorum rağmen, dizileri kullanarak, benim asıl amacı, yeni bir sorgu birisi bir seçeneği seçer her zaman yapmak zorunda kalmamak için oldu. Kolay bir çözüm ben ne yapacağım bu yüzden sadece sorguları devam etmektir.