代码之家  ›  专栏  ›  技术社区  ›  Tales

Laravel中的递归排序

  •  0
  • Tales  · 技术社区  · 6 年前

    递归创建排序集合时出现问题… 假设我有一个项目集合,每个项目都有一个前面的项目的描述。许多项目前面可以有相同的项目。如果项目在行的前面,则值为0。

    以下方法属于类内部的问题是,它只返回集合的第一行项目,即应该在前面的项目。

        /**
         * Returns a collection of items
         *
         * @param \Illuminate\Support\Collection $list
         * @param int $prev
         *
         * @return \Illuminate\Support\Collection
         */
        public function getSortOrder( $list, $prev = 0 ){
            $result = collect();
            $with_prevs = $list->filter( function( $item ) use ( $prev ){
                return $item->data[ 'prev' ] == $prev;
            } );
            $list = $list->diff( $with_prevs );
            if( $with_prevs ->count() > 0 ){
                foreach( $with_prevs as $with_prev ){
                    $result->push( $with_prev );
                    if( $list->count() > 0 ){
                        $result->concat( $this->getSortOrder( $list, $with_prev->id ) );
                    }
                }
            }
            return $result;
        }
    
    1 回复  |  直到 6 年前
        1
  •  0
  •   Tales    6 年前

    出于某种原因,使用 concat merge 当调用递归时,将不起作用。所以解决方案很简单,将递归产生的集合赋给一个变量,并使用 push 方法,这将解决问题。

        /**
         * Devuelve una colección de preguntas en orden
         *
         * @param \Illuminate\Support\Collection $list
         * @param int $prev
         *
         * @return \Illuminate\Support\Collection
         */
        public function getOrdenPreguntas( $listado, $prev = 0 ){
            $result = collect();
            $preguntas = $listado->filter( function( $item ) use ( $prev ){
                return $item->datos[ 'prev' ] == $prev;
            } );
            $listado = $listado->diff( $preguntas );
            if( $preguntas->count() > 0 ){
                foreach( $preguntas as $pregunta ){
                    $result->push( $pregunta );
                    if( $listado->count() > 0 ){
                        $extras = $this->getOrdenPreguntas( $listado, $pregunta->id );
                        foreach( $extras as $extra ){
                            $result->push( $extra );
                        }
                    }
                }
            }
            return $result;
        }