0

可能重复:
根据父 ID 值将数组从一维转换为多维

我正在尝试将一堆类别安排到他们的层次结构中。我有一个类别的 SQL 表,它只存储它们的cid(类别 id)title、、parent(父 id)。

它还没有完成,但基本上我被困在如果一个类别有一个父类别,那么我试图通过引用来获取它(参见 **NOT WORKING** 行)。我想更新 $return 数组以反映更改

//  returns categories in their correct heierarchy
function organize_categories( $array ) {
  $return = array();

  //  instead of retyping the same thing over and over again
  function create_record( $data ) {
    return array(
          'title' => $data->title,
          'children' => array()
    );
  }

  //  go over each row
  foreach( $array as $id => $cat ) {

    //  if it doesn't have a parent (AKA 0)
    if( !$cat->parent ) {

      $return[ $id ] = create_record( $cat );

    } else {

      //  get reference of parent **NOT WORKING**
      $parent =& search_category( $cat->parent , $return );

      if( $parent )
        $parent[ 'children' ][ $id ] = create_record( $cat );
      else
        $return[ $id ] = create_record( $cat );

    }
  }

  return $return;
}

function search_category( $pid , $array ) {

  //  if found within the immediate children
  if( isset( $array[ $pid ] ) ) return $array[ $pid ];

  //  otherwise dig deeper and recurse
  else {
    foreach( $array as $id => $arr ) {
      $find =& search_category( $pid , $arr[ 'children' ] );
      if( $find ) return $find;
    }
  }

  return FALSE;
}

编辑: 如果有人也遇到这个问题,这里是完整的递归解决方案

function &search_category( $pid , &$array ) {

  //  if found within the immediate children
  if( isset( $array[ $pid ] ) ) return $array[ $pid ];

  //  otherwise dig deeper and recurse
  else {
    foreach( $array as &$arr ) {
      $find =& search_category( $pid , $arr[ 'children' ] );
      if( $find ) return $find;
    }
  }
4

2 回答 2

2

通过引用返回工作,您需要做两件事:

  1. &在函数名前添加
  2. 返回一个变量。你不能退货FALSE

$array在您的特定情况下,您可能还希望在将其作为参数传递时提供参考,因此&也要在参数前面添加:

function search_category( $pid , $array ) {
     #### WRONG ####           #### WRONG ####

  //  if found within the immediate children
  if( isset( $array[ $pid ] ) ) return $array[ $pid ];
                                ### CORRECT! ###

  //  otherwise dig deeper and recurse
  else {
    foreach( $array as $id => $arr ) {
      $find =& search_category( $pid , $arr[ 'children' ] );
       ### CORRECT! ###
      if( $find ) return $find;
                  ### CORRECT! ###
    }
  }

  return FALSE;
  #### WRONG ####
}

除此之外,您的代码看起来非常复杂。我敢打赌这可以更容易解决,这也可能使您更容易处理实际参考。只是说。通常你需要做的就是通过孩子ID来引用,因为那些必须父母的孩子会把孩子ID作为他们的父母ID,不是这样吗;)

因此,您需要做的就是通过 ID 键入数组并引用它。其余的由 PHP 完成。这就是引用的实际用途。

于 2012-12-25T18:12:23.957 回答
0

你需要让你的函数通过引用返回,并且由于你是递归的,你还需要通过引用传递你的数组:

function &search_category( $pid , &$array ) {
         ^                        ^

我没有梳理您的代码,因此可能存在其他问题,但这是一个很好的起点。

于 2012-12-25T18:09:05.797 回答