Помогите разделить массив

Тема в разделе "PHP", создана пользователем alex_storm, 30 май 2016.

  1. alex_storm

    alex_storm webdev

    Регистрация:
    11 дек 2012
    Сообщения:
    1.151
    Симпатии:
    667
    Подскажите, как разделить массив такого вида..
    Есть вложенность категорий, доходит до 4-5 уровней. Хочу создать чтобы вложенность по хлебным крошкам сохранилась, а в урле изменилась.
    Была /category/category максимум два уровня.
    Вопрос, как разделить массив там где идет 3-4 и более уровней.

    Входящий:
    PHP:
    Array
    (
        [
    0] => category_id=59
        
    [1] => category_id=60
        
    [2] => category_id=74
    )
    Должен получиться:
    PHP:
    Array
    (
        [
    0] => category_id=59
        
    [1] => category_id=60
    )
    Array
    (
        [
    0] => category_id=59
        
    [1] => category_id=74
    )
    array_chunk не совсем то делает
     
  2. Dotrox

    Dotrox Команда форума

    Регистрация:
    27 ноя 2012
    Сообщения:
    3.198
    Симпатии:
    1.306
    alex_storm, из твоего примера - никак. У тебя есть массив с абсолютно равнозначными значениями для которых не может быть уникального критерия для фильтрации.

    Тебе нужно не id категорий использовать, а path (если речь идёт про ОК).
     
  3. alex_storm

    alex_storm webdev

    Регистрация:
    11 дек 2012
    Сообщения:
    1.151
    Симпатии:
    667
    Да, речь идет о path.
    В нем же как раз и хотел произвести модернизацию категорий
     
  4. alex_storm

    alex_storm webdev

    Регистрация:
    11 дек 2012
    Сообщения:
    1.151
    Симпатии:
    667
    Смотрю сейчас на этот код
    Предварительно делал так:
    PHP:
    if(count($parts 2)) {
       unset(
    $parts[1]);

    foreach (
    $parts as $part) {
    $query $this->db->query("SELECT * FROM " DB_PREFIX "url_alias WHERE keyword = '" $this->db->escape($part) . "'");

    if (
    $query->num_rows) {
       
    $url explode('='$query->row['query']);

    if (
    $url[0] == 'category_id') {
                            if (!isset(
    $this->request->get['path'])) {
                                
    $this->request->get['path'] = $url[1];
                            } else {
                                
    $this->request->get['path'] .= '_' $url[1];
                            }
                        }  
    }
    }
    да, я удаляю второй элемент и вложенность. Но проблема сохраняется, т.е. ссылка все ок встает как нужно, но роута нет по ней, она идет на саму себя.
     
  5. alex_storm

    alex_storm webdev

    Регистрация:
    11 дек 2012
    Сообщения:
    1.151
    Симпатии:
    667
    Тут даже не знаю, как быть. Если взять например обрезать через preg_replace от / до /, то все равно ссылка не изменится в опенкарте.
    Но работать будет)
    Честно говоря не знаю, где искать..
     
  6. Dotrox

    Dotrox Команда форума

    Регистрация:
    27 ноя 2012
    Сообщения:
    3.198
    Симпатии:
    1.306
    Какая у тебя задача? Не на уровне манипуляций с массивом, а какой результат ты хочешь получить от всего этого? Тебе нужно очистить ссылку от родительских категорий?
     
  7. alex_storm

    alex_storm webdev

    Регистрация:
    11 дек 2012
    Сообщения:
    1.151
    Симпатии:
    667
    Задача проста.
    Есть родительская категория первого уровня и от нее все последующие вложенности должны не соблюдаться. Т.е.
    /url-1/url-2/url-3/url-4/url-5/ и т.д это по дефолту.
    А я хочу получить вот что
    /url-1/url-2
    /url-1/url-3
    /url-1/url-4
    /url-1/url-5
    Не смотря ни на что, вложенность должна быть не больше двух категорий на выводе в ссылке.
     
  8. alex_storm

    alex_storm webdev

    Регистрация:
    11 дек 2012
    Сообщения:
    1.151
    Симпатии:
    667
    В общем, сделал костыль, другого решения пока не увидел.
    Там где идет rewrite($link)
    после
    } elseif ($key == 'path') {
    PHP:
    $categories explode('_'$value);

                        if(
    count($categories) == 3) {
                            
    $first array_shift($categories);
                            
    $end array_shift($categories);
                            foreach (
    $categories as $category) {
                                
    $query $this->db->query("SELECT * FROM " DB_PREFIX "url_alias WHERE `query` = 'category_id=" . (int)$category "'");
                                if (
    $query->num_rows && $query->row['keyword']) {
                                    
    $url .= '/katalog/' $query->row['keyword'];
                                } else {
                                    
    $url '';
                                    break;
                                }
                            }
                        }else{
                            foreach (
    $categories as $category) {
                                
    $query $this->db->query("SELECT * FROM " DB_PREFIX "url_alias WHERE `query` = 'category_id=" . (int)$category "'");
                                if (
    $query->num_rows && $query->row['keyword']) {
                                    
    $url .= '/' $query->row['keyword'];
                                } else {
                                    
    $url '';
                                    break;
                                }
                            }
                        }
    Написал такое. По факту всегда подставляется одна категория. Вложенность не играет роли, проверял до 10 доходит и всегда будет выходить /katalog/categories-N

    Уверен, что есть другое адекватное решение, но пока не увидел)
     
  9. Dotrox

    Dotrox Команда форума

    Регистрация:
    27 ноя 2012
    Сообщения:
    3.198
    Симпатии:
    1.306
    А как оно до 10 может быть, если там на 3 проверка? Или я уже не помню, как path формируется.

    Вообще, проще сделать так:
    PHP:
    if(count($categories) > 2) {
        
    $categories = [reset($categories), end($categories)];
    }
     
  10. alex_storm

    alex_storm webdev

    Регистрация:
    11 дек 2012
    Сообщения:
    1.151
    Симпатии:
    667
    Да, об этом как раз и не подумал...
    Почему до 10 доходит хз) Но формирование проходит четко.

    Единственная проблема, которая сейчас вытекла, это сообственно то, что хлебные крошки и родитель в меню потерялись. Придется походу костыль писать