0

今日は頭を壁にぶつけました。再帰的な親子関係を持つメニュー項目のリストを持つ mysql テーブルがあります。それに一致する連想配列を作成する必要があります。

ここに私のコードがあり、その下に私の問題の説明があります。

MySQL データベース

CREATE TABLE IF NOT EXISTS `menus` (
  `sectionid` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `parentid` int(10) unsigned NOT NULL DEFAULT '0',
  `name` varchar(128) NOT NULL DEFAULT '',
  PRIMARY KEY (`sectionid`)
);

INSERT INTO `menus` (`sectionid`, `parentid`, `name`) VALUES
(1, 0,'DOWNLOADS'),(4, 1,'Player Scenarios'),
(5, 1,'Co Op Scenarios'),(9, 1,'MAPS');

PHP コード

function get_db_children($parentid) {

  $mysqli = mysqli_open();
  $sqlStr = "select sectionid as childid from menus where parentid=$parentid order by sectionid";
  $result = $mysqli->query($sqlStr);
  $mysqli->close();

  return $result;

}

function get_children(&$node) {

  foreach ($node as $key=>$value) {
    $result = get_db_children($key);
    while ($row = $result->fetch_assoc()) {
       $tmp = array($row['childid'] => array());
       $node[$key][$row['childid']]= get_children($tmp);
    }
  }
  return $node;
}

===========================================

上記の関数は、次のようにメイン スクリプトから呼び出されます。

$categories[0] = array ();
get_children($categories);
print "Categories=".print_r($categories);
exit;

==============

私の問題。

私の問題は、返された配列の構造が、私が望む方法とはまったく異なることです。

上記のコードは次を返します。

Categories=
Array ( [0] => Array 
        ( [1] => Array 
          ( [1] => Array 
            ( [4] => Array 
              ( [4] => Array ( ) )
              [5] => Array 
              ( [5] => Array ( ) )
              [9] => Array 
              ( [9] => Array ( ) )
            )
          )
        )
      ) 

私が欲しいのは:

Categories=
Array ( [0] => Array 
          ( [1] => Array 
            (
              ( [4] => Array ( ) )
              ( [5] => Array ( ) )
              ( [9] => Array ( ) )
            )
          )
      )

null 配列は、子がないことを示します。

キー値の二重化を取り除く方法がわかりません。:(

誰かが助けてくれれば、大歓迎です。

乾杯、昼寝

4

2 に答える 2

1

アプローチを少し変更すると、問題が解決しました。参照によって配列を渡す代わりに$categories、親メニュー項目の ID を渡して配列を返すだけです。

get_db_children($parentid)以下のコードは、OP で指定されているものと同じ SQL データと SQL アクセサー関数を使用します。これは改善できると確信していますが、少なくとも結果は得られました。

@Josh、ご意見ありがとうございます。

PHP 関数

function get_twigs($nodeid) {

  $result = get_db_children($nodeid);
  if ($result->num_rows != 0) {
    while ($row = $result->fetch_assoc()) {
      $node[$row['childid']] = array();
      $node[$row['childid']] = get_twigs($row['childid']);
    }
  } else {
    $node=NULL; // or any other 'no children below me indicator.
  }
  return $node;
}

function get_branch($nodeid) {

  $node[$nodeid] = array();
  $node[$nodeid] = get_twigs($nodeid);
  return $node;
}

PHP 呼び出し元

$categories = get_branch(0);

やっと出来上がりました。

:)

于 2013-02-16T14:30:17.537 に答える
0

あなたは参照渡しをして$nodeいるので、$node[$key][$row['childid']] = get_children($tmp);実際にやるべきではありません

$value[$row['childid']] = get_children($tmp)

また

$node[$row['childid']] = get_children($temp)

$categories[0]ただし、2 番目のオプションを使用する場合は、最初の呼び出しを渡す必要がありますget_children(これは、繰り返し呼び出しを行うときに行っていることです)。

アップデート:

その理由を説明してみてください...

ご覧のとおり、最初のエントリ (0) は複製されていません。最初の繰り返し呼び出しが問題の開始場所である場合にのみ、その理由は参照によって子配列を渡しているためです。そのため、[例として] var を呼び出す2回目はget_children$node実際にはすでにネストされた部分を参照しています

array(
   0=>array(
      1=>array(/*this is what $node actually is the second time around*/
         /*when you say $node[$key][$row['childid']] what you are actually saying is assign the value to array[0][1][1][4] = array())*/
      )
   )
);

これが役立つことを願っています。私がそれを説明する方法を考えることができれば、バッターは戻ってきて更新します...

于 2013-02-16T10:15:56.887 に答える