2013-09-18 3 views
1

Прежде всего извиняюсь за мой плохой английскийАлгоритм для исключения выбора

У меня есть проблема с алгоритмом, за исключением выбора

у меня есть такие настройки

enter image description here

На основе этих параметров, пользователь есть возможность выбрать 3 комбинированных ящика

Например, мои комбо-поля

First combo------Second combo------Third combo 

2-------------|-------100-------|------35 

2-------------|-------100-------|------40 

2-------------|-------100-------|------55 

2-------------|-------100-------|------72 

2-------------|-------25--------|------35 

2-------------|-------25--------|------40 

2-------------|-------25--------|------55 

Когда я выбираю в первом комбо 2, во втором комбо мне нужно два варианта 100 и 25.

Когда я выбираю второе комбо 100, в третьем комбо мне нужен один выбор 35.

Когда я выбираю второе комбо 25, в третьем комбо мне нужно три варианта 35 и 40 и 55.

в моей БД я сериализовать массив только с исключенной ID вариантов

a:3:{i:2;s:1:"3";i:3;s:1:"8";i:4;s:2:"10";} 
a:3:{i:2;s:1:"3";i:3;s:1:"8";i:4;s:2:"11";} 
a:3:{i:2;s:1:"3";i:3;s:1:"8";i:4;s:2:"12";} 

Если десериализации этого массива я получить

array (size=3) 
    2 => string '3' (length=1) 
    3 => string '8' (length=1) 
    4 => string '10' (length=2) 
array (size=3) 
    2 => string '3' (length=1) 
    3 => string '8' (length=1) 
    4 => string '11' (length=2) 
array (size=3) 
    2 => string '3' (length=1) 
    3 => string '8' (length=1) 
    4 => string '12' (length=2) 

Пожалуйста, помогите мне написать код

Я попытался написать его сам, но безрезультатно :(

Видимо я кодировщик и не программист :(

Вот моя попытка

<?php 
function _uc_dependent_attributes_get_dependency_for_node() 
{ 
    $nid = 61; 
    if(!$nid) 
     return; 

    $result = db_query("SELECT combination FROM {uc_dependent_attributes} WHERE nid = :nid", array(':nid' => $nid)); 
    $combos = array(); 
    foreach($result as $record) 
    { 
     $combos[] = unserialize($record->combination); 
    } 

    $attributes = node_load($nid)->attributes; 
    $attrs = array(); 
    foreach($attributes as $attr) 
    { 
     $attrs['a' . $attr->aid] = array(); 
     $attrs['a' . $attr->aid]['name'] = $attr->name; 
     $attrs['a' . $attr->aid]['aid'] = $attr->aid; 
     if(!empty($attr->options)) 
     { 
      foreach($attr->options as $option) 
      { 
       $attrs['a' . $attr->aid]['options']['o' . $option->oid] = $option->name; 
      } 
     } 
    } 
    ttt($attrs, $combos, array(
     'attr_2' => 2, 
     'opt_4' => 4, 
    )); 
} 

function ttt($attrs, $combos, $selections = array()) 
{ 
    var_dump($attrs); 
    var_dump($combos); 

    foreach($combos as $combo) 
    { 
     foreach($combo as $c_aid => $c_oid) 
     { 
      foreach($attrs as $a_aid => $attr) 
      { 
       if('a' . $c_aid == $a_aid) 
       { 
//     var_dump($attrs[$a_aid]['options']['o' . $c_oid]); 
//     if(isset($attrs[$a_aid]['options']['o' . $c_oid]) && 'o' . $c_oid != 'o' . $opt_id) 
//      unset($attrs[$a_aid]['options']['o' . $c_oid]); 
       } 
      } 
     } 
    } 

    echo '<table border="1"><tr>'; 
    foreach($attrs as $attr) 
    { 
     $sa = false; 
     foreach($selections as $key_s => $selected) 
     { 
      if(strstr($key_s, 'attr_') !== false && $selected == $attr['aid']) 
      { 
       $sa = true; 
       break; 
      } 
     } 
     echo '<td>' . ($sa ? '<strong>' : '') . '(' . $attr['aid'] . ')' . $attr['name'] . ($sa ? '</strong>' : '') . '</td>'; 
    } 
    echo '</tr><tr>'; 
    foreach($attrs as $attr) 
    { 
     echo '<td>'; 
     foreach($attr['options'] as $key => $opt) 
     { 
      $so = false; 
      foreach($selections as $key_s => $selected) 
      { 
       if(strstr($key_s, 'opt_') !== false && 'o' . $selected == $key) 
       { 
        $so = true; 
        break; 
       } 
      } 
      echo ($so ? '<strong>' : '') . "($key) " . $opt . ($so ? '</strong>' : '') . '<br>'; 
     } 
     echo '</td>'; 
    } 
    echo '</tr></table>'; 
} 
?> 

ответ

1

Если вы хотите достичь этого на стороне клиента: см. http://code.google.com/p/jquery-option-tree/ Если вы хотите добиться этого на стороне сервера, вам понадобится фрагмент JavaScript, который вызывает отправку формы каждый раз, когда пользователь выбирает элемент в поле со списком, то на стороне сервера вы соответствующим образом фильтруете каждую выпадающую ячейку. Я думаю, что первое решение является самым простым и элегантным. Однако вам нужно будет использовать библиотеку JQuery. См. http://kotowicz.net/jquery-option-tree/demo/demo.html для демонстрации.

Смежные вопросы