ビルド関数の実行中に、すでにハッシュで結果を生成しているすべてのコンポーネントを追跡し、それらのうちの1つが再び発生した場合は無視します。ここで
はあなたがインスピレーションのために使用できるいくつかの定型的なコードです:
// Sample "database":
$components = array(
1 => array (
"id" => 1,
"name" => "bike",
"needs" => array (
array ("id" => 2, "count" => 2), // 2 wheels
array ("id" => 3, "count" => 1), // 1 handlebar
),
"folder" => "/my/folders/bike"
),
2 => array(
"id" => 2,
"name" => "weel",
"needs" => array(
array("id" => 4, "count" => 1), // 1 tire
array("id" => 1, "count" => 1) // 1 wheel?? - erroneous information!
),
"folder" => "/my/folders/wheel"
),
3 => array(
"id" => 3,
"name" => "handlebar",
"needs" => array(),
"folder" => "/my/folders/handlebar"
),
4 => array(
"id" => 4,
"name" => "tire",
"needs" => array(),
"folder" => "/my/folders/tire"
)
);
// Build function: returns a list of folders related
// to all the parts of the given component.
function build($componentId, $components, $hash = array()) {
// Protection against infinite recursion:
if (isset($hash[$componentId])) return [];
$elem = $components[$componentId];
// set hash, keyed by component ID.
$hash[$componentId] = 1;
// Add folder for this component
$folders[] = $elem['folder'];
// Collect folders of dependent components recursively
foreach($elem['needs'] as $child) {
// ... pass the hash as third argument
$folders = array_merge($folders, build($child["id"], $components, $hash));
}
return $folders;
}
// Example call: build component with ID 1, returning a list of folders:
print_r (build(1, $components));
上記のコードの出力は次のようになります。
Array
(
[0] => /my/folders/bike
[1] => /my/folders/wheel
[2] => /my/folders/tire
[3] => /my/folders/handlebar
)
ので、自転車が二度目に遭遇したとき、それはましたただ無視されました。
あなたの車輪はなぜ自転車を必要としますか?ホイールは、より多くの製品、バイク、自動車、スケート、スケートボードに使用できるパーツです。車輪はそれ自身のために存在することができるが、自転車は存在しない。 – KhorneHoly
ちょっと関連しています:[ここ](http://codereview.stackexchange.com/questions/94669/adjacency-list-with-array-data)、子供を自転車と車輪として親を考えてみましょう。 – Viral
私は将来、私のデータベースに何千もの記事があり、間違いは簡単にできると思います。それが私に任せられていたとしても気にしません...私は気にかけている人のために働いています...ああ – void