ホームページ > バックエンド開発 > PHPチュートリアル > 子と親は同じ商品になりますか? $term_id == $child?

子と親は同じ商品になりますか? $term_id == $child?

WBOY
リリース: 2016-06-20 12:32:41
オリジナル
932 人が閲覧しました

get_term_children 関数内:
子と親は同じアイテムになりますか? ? ? $term_id == $child? ? ?
以下は長い間迷っていたソースコードです。アドバイスをお願いします。
/**
* すべてのタームの子を単一の ID 配列に結合します。
*
* この再帰関数は、$term のすべての子を同じ
* 用語 ID の配列にマージします。 階層的な分類法にのみ役立ちます。
*
* $term が $taxonomy に存在しない場合は、空の配列を返します。
*
* @since 2.3.0
*
* @param string $term_id 子を取得する用語の ID 。
* @param 文字列 $taxonomy 分類名。
* @return array|WP_Error 用語 ID のリスト。 「$taxonomy」が存在しない場合、WP_Error が返されます。
 */
function get_term_children( $term_id, $taxonomy ) {
if ( !taxonomy_exists($taxonomy) )
return new WP_Error('invalid_taxonomy', __('無効な分類法'));

$term_id = intval( $term_id );

$terms = _get_term_hierarchy($taxonomy);

if ( ! isset($terms[ $term_id]) )
return array();

$children = $terms[$term_id];

foreach ((array) $terms[$term_id] as $child ) {
if ( $term_id == $child ) {
continue
}

if ( isset($terms[$child]) )////子も項目の場合
$children = array_merge($children, get_term_children($child, $taxonomy));
}

return $children
}
添付ファイル:
/ **
* 分類の子を用語 ID として取得します。
* 子项仅返し term_id
* @ignore
* @since 2.3.0
*
* @param string $taxonomy Taxonomy name。
* @return array $taxonomy が階層的でない場合、または子 をTerm IDとして返す場合は空になります。
 */
function _get_term_hierarchy( $taxonomy ) {
if ( !is_taxonomy_hierarchical($taxonomy) )
return array()
$children = get_option("{$taxonomy); } _children");

if ( is_array($children) )
return $children;
$children = array();
$terms = get_terms($taxonomy, array(' get ' => 'all', 'orderby' => 'id=>parent')); $terms as $term_id => ) {
if ( $parent > 0 )
$children[$parent][] = $term_id;
}
update_option("{$taxonomy}_children", $children); 🎜 >
return $children;


返信議論へ (解決策)
データベース テーブルの各列のデータ制限は、実際的な意味を持つことが保証されていません。

if ( $term_id == $child ) -- データの有効性を検証します。

これは、WordPress バックエンドを通じて挿入されたデータでは発生しません。ただし、データベースに直接挿入されたデータでこれが起こるという保証はありません。

get_term_children はすべてのサブカテゴリを抽出するために使用されます
パラメータ
$term_id はチェックを開始するカテゴリ ID
$taxonomy はカテゴリ名

$terms = _get_term_hierarchy($taxonomy );
名前でチェックする分類 ID セットを取得します

foreach ( (array) $terms[$term_id] as $child ) {
if ( $term_id == $child ) {
continue;
}
取得したカテゴリ ID セットを調べて、対応する操作を実行します

$term_id はカテゴリ ID であるため、カテゴリ ID セットに表示されるのが通常です

論理的に言えば、自分自身が自分の親になることはできません。あなたが上で言ったことは正しいです。ただし、データはデータベースから取得しており、ここでのデータは Web サイトのバックエンドから、または運用データベースから直接追加されたものです。 if ( $term_id == $child ) ---- このような検証は、Web サイトのバックグラウンドから挿入されたデータの場合は不要です。データベースの直接操作によって追加されたデータの場合、実用的な意味を持つ可能性があります。
この理解が包括的であるかどうかはわかりません

$terms = _get_term_hierarchy($taxonomy);
は、チェックされる分類 ID のコレクションを名前
で取得するため、次のように仮定することはできません$term_id は確実である _get_term_hierarchy($taxonomy) の結果には含まれていない
対応するのは名前と ID だけではないため、_get_term_hierarchy は依然としてあいまいクエリであることは言うまでもありません

答えは次のとおりです: function wp_insert_term ( $term, $taxonomy, $args = array( ) ) ----
分類が階層的で、'parent' 引数が空でない場合、
用語が挿入され、term_id が与えられます。 .
親引数は term_id と関連している必要はありません。
弱い質問: 平等な状況は存在するでしょうか?次のコードを見ると、これが起こる可能性があります。
foreach ( (array) $terms[$term_id] as $child ) {
if ( $term_id == $child ) {
continue; 🎜> }
どう理解すればいいのかわかりませんよね?アドバイスをお願いします。

$terms = _get_term_hierarchy($taxonomy);

$terms は他のチャネルから取得されるため、$terms[$term_id] に $term_id が含まれるのは通常です
彼はすでにこれを処理していますway
if ( $term_id == $child ) { //その場合は
continue // ループを続行し、他の操作は行いません
}
したがって、続行する必要はありません。心配しないでください

知りたいだけなら: どのような状況で $term_id == $child
続行する前に $terms と $taxonomy を印刷して確認してください


項目の末尾を下から反復して返す
このように理解すれば問題ありません。

一度に反復 (再帰) を理解できなければ、さらに混乱するだけです。


再帰の 2 つの特徴: A 関数が繰り返し自分自身を呼び出す B あるは終了であり、初期化値があります

マークした終了は実際には終了ではありません。

continue はフロー制御ステートメントです。

continue は、このループ内の残りのコードをスキップし、条件が true と評価されたときに次のループの実行を開始するためにループ構造で使用されます。

この再帰には出口がありませんね?本当に見つかりません

再帰は条件付きです: サブ項目がある場合のみ、再帰は


に入ります。 あなたによると、これは何を意味しますか?再帰的とはみなされませんか?混乱した。アドバイスをお願いします。

再帰

の場合: 条件付きエントリ (幅優先)
の場合: 条件付き戻り (深さ優先)
具体的な用途はアプリケーション シナリオに従って決定する必要があります

トラバース処理とループ処理がよく分からず、ますます混乱してしまいます。ご指導ありがとうございます、マスター。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート