0

重複の可能性:
親ID値に基づいて配列を1次元から多次元に変換する

たくさんのカテゴリをそれらの階層に配置しようとしています。cid(カテゴリID)、、titleparent親ID)のみを格納するカテゴリのSQLテーブルがあります。

まだ完了していませんが、基本的に、カテゴリに親がある場合、参照によってそれを取得しようとしているところに行き詰まっています(**動作していません**の行を参照)。変更を反映するように$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

参照による返品を機能させるには、次の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 に答える