【问题标题】:Recursive sorting in LaravelLaravel 中的递归排序
【发布时间】:2018-12-20 14:49:48
【问题描述】:

我在递归创建排序集合时遇到问题... 假设我有一个项目集合,每个项目都有一个对它前面的项目的描述。许多项目可以在前面有相同的项目。如果该项在行前,则值为 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;
    }

【问题讨论】:

    标签: php sorting recursion laravel-5


    【解决方案1】:

    由于某种原因,在调用递归时使用concatmerge 将不起作用。所以解决方法很简单,将递归生成的集合赋值给一个变量,并使用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;
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-12
      • 2017-01-14
      • 2017-04-09
      • 2013-10-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多