Дерево иерархии сортировка по алфавиту - PullRequest
0 голосов
/ 11 июля 2019

Текущий код работает очень хорошо. Но можно ли поставить первую букву основного массива над словом? И не повторяйте, как в слове «Больше» ниже. В качестве примера ниже. G, M, W ... и другие, если они имеют. Спасибо за помощь. Я не знаю, правильно ли я это объяснил.

G
Good

M 
Men
  ╚═►Watches
     ╚═►Rolex

More

W 
Women
  ╚═►Bras
     ╚═►Bedroom  
  ╚═►Jackets

Используя код php ниже.

    /**
 * Heres your categories array structure, they can be in any order as we will sort them into an hierarchical structure in a moment
 */
$categories = array();
$categories[] = array('id'=>9, 'parent_id' => 0, 'name' => 'More', 'slug' => 'more', 'status' => 1);
$categories[] = array('id'=>8, 'parent_id' => 0, 'name' => 'Good', 'slug' => 'good', 'status' => 1);
$categories[] = array('id'=>5, 'parent_id' => 4, 'name' => 'Bedroom wear', 'slug' => 'bwear', 'status' => 1);
$categories[] = array('id'=>6, 'parent_id' => 3, 'name' => 'Rolex', 'slug' => 'rolex', 'status' => 1);
$categories[] = array('id'=>1, 'parent_id' => 0, 'name' => 'Men', 'slug' => 'men', 'status' => 1);
$categories[] = array('id'=>2, 'parent_id' => 0, 'name' => 'Women', 'slug' => 'women', 'status' => 1);
$categories[] = array('id'=>3, 'parent_id' => 1, 'name' => 'Watches', 'slug' => 'watches', 'status' => 1);
$categories[] = array('id'=>4, 'parent_id' => 2, 'name' => 'Bras', 'slug' => 'bras', 'status' => 1);
$categories[] = array('id'=>7, 'parent_id' => 2, 'name' => 'Jackets', 'slug' => 'jackets', 'status' => 1);


/**
 * This function takes the categories and processes them into a nice tree like array
 */
function preprocess_categories($categories) {

    // First of all we sort the categories array by parent id!
    // We need the parent to be created before teh children after all?
    $parent_ids = array();
    foreach($categories as $k => $cat) {
        $parent_ids[$k] = $cat['parent_id'];
        $main_nm[$k] = $cat['name'];
    }
    //array_multisort($parent_ids, SORT_ASC, $categories);
    array_multisort($parent_ids, SORT_ASC, $main_nm, SORT_ASC, $categories);

    /* note: at this point, the categories are now sorted by the parent_id key */

    // $new contains the new categories array which you will pass into the tree function below (nothign fancy here)
    $new = array();

    // $refs contain references (aka points) to places in the $new array, this is where the magic happens!
    // without references, it would be difficult to have a completely random mess of categories and process them cleanly
    // but WITH references, we get simple access to children of children of chilren at any point of the loop
    // each key in this array is teh category id, and the value is the "children" array of that category
    // we set up a default reference for top level categories (parent id = 0) 
    $refs = array(0=>&$new);

    // Loop teh categories (easy peasy)
    foreach($categories as $c) {

        // We need the children array so we can make a pointer too it, should any children categories popup
        $c['children'] = array();

        // Create the new entry in the $new array, using the pointer from $ref (remember, it may be 10 levels down, not a top level category) hence we need to use the reference/pointer
        $refs[$c['parent_id']][$c['id']] = $c;

        // Create a new reference record for this category id
        $refs[$c['id']] = &$refs[$c['parent_id']][$c['id']]['children'];

    }

    return $new;

}

/**
 * This function generates our HTML from the categories array we have pre-processed
 */
function tree($categories, $baseurl = '/category/') {

     $tree = "<ul>";

     foreach($categories as $category) {

        $tree .= "<li>";

        $tree .= "<a href='".$baseurl.$category['slug']."'>".$category['name']."</a>";

        // This is the magci bit, if there are children categories, the function loops back on itself
        // and processes the children as if they were top level categories
        // we append the children to the main tree string rather tha echoing for this reason
        // we also pass the base url PLUS our category slug as the "new base url" so it can build the URL correctly
        if(!empty($category['children'])) {

            $tree .= tree($category['children'], $baseurl.$category['slug'].'/');

        }

        $tree .= "</li>";


     }

     $tree .= "</ul>";

     return $tree;

}

///echo "<pre>"; print_r(preprocess_categories($categories)); die();
echo tree( preprocess_categories( $categories ) );

1 Ответ

0 голосов
/ 11 июля 2019

Я думаю, что самый простой способ справиться с этим - это перебрать массив $new еще раз. Я собрал быстрое редактирование вашего кода ниже. Поместите это в функцию preprocess_categories прямо в конце. Не забудьте удалить строку return $new; кода. В прикрепленном фрагменте кода уже есть return.


    // SET A NEW DEFAULT ARRAY

    $new_by_alpha = array();

    // LOOP THROUGH THE $new ARRAY ONE MORE TIME
    // we only need to loop through the top level arrays in the main array since we will keep the children arrays intact

    foreach ( $new as $obj ) {

        // CALCULATE THE MAIN CATS FIRST CHARACTER FROM NAME

        $name   = $obj[ 'name' ];
        $alpha  = strtoupper( substr( $name , 0 , 1 ) );

        // CHECK TO SEE IF THE NEW TOP LEVEL ALPHA ID IS SET IN THE $new_by_alpha ARRAY
        // if its not set, then we create it with default variables and values

        if ( !isset( $new_by_alpha[ $alpha ] ) || empty( $new_by_alpha[ $alpha ] ) ) {

            $new_by_alpha[ $alpha ] = array(

                'id'        => $alpha,
                'name'      => $alpha,
                'slug'      => '#',
                'status'    => 1,
                'chlidren'  => array(),

            );

        }

        // NOW THAT WE ARE SURE THAT THE VERY TOP LEVEL IS SET WE CAN ADD THE FULL OBJECT TO IT

        $new_by_alpha[ $alpha ][ 'children' ][] = $obj;

    }

    return $new_by_alpha;

По сути, здесь происходит то, что мы берем массивы верхнего уровня в вашем массиве $new и просто реорганизуем их в новые массивы верхнего уровня.

...