Помощь с массивами

Тема в разделе "Как сделать...", создана пользователем smertnik, 19 июл 2012.

  1. smertnik

    smertnik Постоялец

    Регистр.:
    5 июн 2006
    Сообщения:
    68
    Симпатии:
    30
    Добрый день.

    Помогите решить такую задачу.
    Есть два Массива:
    PHP:
    $select = Array("YAR""BEST_SELLER""COMING_SOON""NEW");
    $filter = Array(
        
    "BEST_SELLER" => Array("1"),
        
    "NEW" => "1",
    );
    В результате их обработки должно получиться следующее:
    PHP:
    $result = Array(
        
    "0" => Array(
            
    "select" => Array("YAR""COMING_SOON"),
            
    "filter" => Array(
                
    "BEST_SELLER" => Array("1"),
                
    "NEW" => "1",
            ),
        ),
        
    "1" => Array(
            
    "select" => Array("BEST_SELLER"),
            
    "filter" => Array("NEW" => "1"),
        ),
        
    "2" => Array(
            
    "select" => Array("NEW"),
            
    "filter" => Array("BEST_SELLER" => Array("1")),
        ),
    );
    Соответственно если в $filter добавиться еще условие, то должно получиться так:
    PHP:
    $filter = Array(
        
    "BEST_SELLER" => Array("1"),
        
    "NEW" => "1",
        
    "YAR" => "2012",
    );
     
    $result = Array(
        
    "0" => Array(
            
    "select" => Array("YAR"),
            
    "filter" => Array(
                
    "BEST_SELLER" => Array("1"),
                
    "NEW" => "1",
            ),
        ),
        
    "1" => Array(
            
    "select" => Array("BEST_SELLER"),
            
    "filter" => Array("NEW" => "1""YAR" => "2012"),
        ),
        
    "2" => Array(
            
    "select" => Array("COMING_SOON"),
            
    "filter" => Array("NEW" => "1""BEST_SELLER" => Array("1"), "YAR" => "2012"),
        ),
        
    "3" => Array(
            
    "select" => Array("NEW"),
            
    "filter" => Array("BEST_SELLER" => Array("1"), "YAR" => "2012"),
        ),
    );
    Постоянно захожу в тупик, кол-во вложенных foreach с проверками стремиться к бесконечности.
     
  2. PapaJoe

    PapaJoe

    Регистр.:
    4 авг 2008
    Сообщения:
    620
    Симпатии:
    311
    не могу понять вашу логику :confused:
    перебираются только значения, входящие в $filter? или все, указанные в $select?
    вот код:
    PHP:
    $select = Array("YAR""BEST_SELLER""COMING_SOON""NEW");
    $filter = Array(
    "BEST_SELLER" => Array("1"),
    "NEW" => "1",
    "YAR"=>"2012",
    );
    $i=0;
    foreach(
    $filter as $key => $value){
    $r=array($key=>$value);
    $result[$i]["select"]=$key;
    $result[$i]["filter"]=array_diff_key($filter,$r);
    ++
    $i;
    }
    print_r($result);
    Попробуйте и скажите что не так. Лучше бы было не только пример предоставить, но и словесно описать то, что нужно получить на выходе из этих 2-х массивов
     
    smertnik нравится это.
  3. smertnik

    smertnik Постоялец

    Регистр.:
    5 июн 2006
    Сообщения:
    68
    Симпатии:
    30
    Смысл сводиться к построению параметров для запросов к бд, для фильтрации (попытка сделать аналог фильтра:

    когда показываются свойства, которые могут участвовать в дальнейшей фильтрации.
    ).
    На первом этапе нужно собрать в выборке все поля из $select, которых нет в $filter, т.е.
    PHP:
    "0" => Array(
            
    "select" => Array("YAR""COMING_SOON"),
            
    "filter" => Array(
                
    "BEST_SELLER" => Array("1"),
                
    "NEW" => "1",
            ),
        ),
    Тем самым выбрав все поля не участвующие в фильтре, для их исключения из дальнейшего выбора.

    Далее, для полей из $select, которые есть $filter, нужно составить запросы которые будут выбирать свойство участвующее в фильтре, но не включая фильтр по данному выбираемому свойству, т.е.
    PHP:
    "1" => Array(
            
    "select" => Array("BEST_SELLER"),
            
    "filter" => Array("NEW" => "1"),
        ),
        
    "2" => Array(
            
    "select" => Array("NEW"),
            
    "filter" => Array("BEST_SELLER" => Array("1")),
        ),
    За предложенный код спасибо, компактный и абсолютно верно строит вторую часть фильтрации.
     
  4. PapaJoe

    PapaJoe

    Регистр.:
    4 авг 2008
    Сообщения:
    620
    Симпатии:
    311
    а первая часть еще проще:
    PHP:
    $result[0]["select"]=array_diff($select,array_keys($filter));
    $result[0]["filter"]=$filter;
    $i=1;
    правда, индексы остаются от первоначального массива, например:
    Код:
    [select] => Array
    (
    [2] => COMING_SOON
    )