【问题标题】:PHP get array property by reference [duplicate]PHP通过引用获取数组属性[重复]
【发布时间】:2012-12-11 13:19:18
【问题描述】:

可能重复:
Converting an array from one to multi-dimensional based on parent ID values

我正在尝试将一堆类别排列到它们的层次结构中。我有一个类别的 SQL 表,仅存储它们的 cid(类别 ID)、titleparent(父 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;
    }
  }

【问题讨论】:

  • this 也可能对您有所帮助。

标签: php arrays variables reference


【解决方案1】:

要让return by reference 工作,您需要做两件事:

  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 完成。这就是引用的实际用途。

【讨论】:

  • 好的,谢谢您的解释
  • 在我的情况下,我需要在 html 选择字段中根据其层次结构显示每个类别,因此我需要先以这种方式组织它
  • 我注意到我现在遇到了同样的初始问题,它在 else,foreach 语句中(您标记的所有内容都是正确的)。它返回正确的变量,但不是作为参考
  • Nevermind 发现它必须在 foreach( $array as $id => &$arr ) { 中添加一个 & 符号
  • @MariusMiliunas:我在这里留下了一个大致的描述它是如何工作的(代码的一部分):stackoverflow.com/a/14033570/367456 - 这也会让你更快。
【解决方案2】:

你需要让你的函数通过引用返回,因为你是递归的,你还需要通过引用传递你的数组:

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

我没有梳理你的代码,所以可能还有其他问题,但这是一个很好的起点。

【讨论】:

    猜你喜欢
    • 2014-12-01
    • 2018-07-09
    • 1970-01-01
    • 2014-12-19
    • 1970-01-01
    • 1970-01-01
    • 2019-10-20
    • 2012-12-07
    相关资源
    最近更新 更多