PHP рекурсивная функция для отображения допустимых комбинаций значений массива - PullRequest
0 голосов
/ 19 декабря 2009

У меня есть массив PHP, который выглядит следующим образом:

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
)

Массив на самом деле длиннее и содержит около 40 элементов. Будут другие массивы, которые содержат различное количество дочерних элементов. Массив отформатирован как

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

Мне нужен массив, который показывает действительные значения для всех других атрибутов. Выходной массив может выглядеть примерно так:

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

Формат этого массива:

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

Я работал с некоторыми рекурсивными функциями, но мне удалось получить только список всех возможных комбинаций между всеми значениями, а это не то, что мне нужно. Любая помощь будет принята с благодарностью.

Разъяснение того, что я подразумеваю под «действительными» значениями. Здесь значения 1, 2 и 3 представляют цвет, размер и длину. Конечной целью здесь является создание серии массивов javascript, которые я буду использовать для обновления параметров на странице, когда пользователь выбирает значения. Например, когда они выбирают черный цвет, мне нужно обновить размеры и длину на странице, чтобы отразить только размеры и длины, доступные в черном цвете. Я могу создать массивы вручную, но это не очень хорошее решение.

Ответы [ 3 ]

1 голос
/ 19 декабря 2009

Хорошо, если я получу это прямо сейчас, у вас есть Продукты с четырьмя атрибутами: идентификатор, цвет, размер и длина, которые вы представляете как

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

Лично я считаю эту структуру несколько неуклюжей. Идентификатор продукта должен быть внутри массива, поскольку он является атрибутом продукта. Кроме того, использование индексных номеров вместо имен свойств затрудняет понимание ваших продуктов.

Теперь, что вы хотите сделать, это найти все возможные комбинации одного из атрибутов, например, все size_id и length_id, когда пользователь выбирает color_id, например, для черный.

Вы можете сделать это с помощью метода поиска:

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;
}

Теперь, когда вам нужно найти все комбинации для черного и черного с color_id, равным 0, вы должны сделать findCombinationsByColorId(0, $productArray), и он вернет массив, содержащий все возможные размеры, длины и идентификаторы продуктов для этого цвета.

Вы бы написали дополнительные функции для получения комбинаций по другим атрибутам. Вы можете сделать метод поиска универсальным, но я оставлю это на ваше усмотрение, чтобы выяснить, как это сделать.

Чего я не понимаю, так это почему вы вообще сортируете это на уровне массива. Я предполагаю, что вы откуда-то получаете возможные продукты, например, база данных. Так почему бы не получить комбо оттуда. Это, вероятно, будет так же просто, как SELECT size_id, length_id, product_id from products where color_id = 0.

0 голосов
/ 20 декабря 2009

Ответ, предоставленный Гордоном, наиболее близок к тому, что я ищу, но не очень эффективен, учитывая способ форматирования моего исходного массива. Хотя я не могу вспомнить, почему сейчас, моя первоначальная цель при использовании массивов состояла в том, чтобы не делать новый запрос каждый раз, когда кто-то выбирает опцию. Самое простое решение - просто продолжить запросы, вот что я сделаю.

0 голосов
/ 19 декабря 2009

Предполагается, что результат на самом деле должен быть:

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

(Если нет, то откуда берутся значения атрибутов?)

Рекурсия не понадобится, просто что-то вроде этого, чтобы перенастроить массив:

$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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...