組織數據會以這樣的方式的最簡單的方法:
array (
'Animal' =>
array (
'Turtle' =>
array (
'Sea Turtle',
'Box Turtle',
'Green Turtle' =>
array (
'Green Turtle With Brown Tail',
),
'Common Turtle',
),
),
);
// Or, otherwise written (equivalent to the above)
$animals = array();
$animals['Animal'] = array();
$animals['Animal']['Turtle'] = array();
$animals['Animal']['Turtle'][] = 'Sea Turtle';
$animals['Animal']['Turtle'][] = 'Box Turtle';
$animals['Animal']['Turtle']['Green Turtle'] = array();
$animals['Animal']['Turtle']['Green Turtle'][] = 'Green Turtle With Brown Tail';
$animals['Animal']['Turtle'][] = 'Common Turtle';
從本質上講,動物的名字是價值,除非它有孩子,那麼這個值是一個數組,關鍵是動物的名字。
這樣的話,你可以很容易地通過執行以下操作解析值:
parse_animals($animals);
function parse_animals($array, $indent = 0) {
if(!is_array($array)) return; // A little safe guard in case.
foreach($array as $key => $value) {
echo str_repeat(' ', $indent) . "- ";
if(is_array($value)) {
echo $key . "\n";
parse_animals($value, $indent + 1);
} else {
echo $value . "\n";
}
}
}
在控制檯上面會輸出如下:
- Animal
- Turtle
- Sea Turtle
- Box Turtle
- Green Turtle
- Green Turtle With Brown Tail
- Common Turtle
編輯:和這裏是一個版本,將輸出它的網頁。
function parse_animals_web($array) {
if(!is_array($array)) return; // A little safe guard in case.
foreach($array as $key => $value) {
echo '<ul>';
if(is_array($value)) {
echo '<li>' . htmlentities($key) . "</li>";
parse_animals_web($value);
} else {
echo '<li>' . htmlentities($value) . "</li>";
}
echo '</ul>';
}
}
的輸出是:
也許你要得到一個動物的孩子。
function get_children_of($array, $name) {
foreach($array as $key => $value) {
if(is_array($value)) {
if($key === $name) {
return $value;
} else {
return get_children_of($value, $name);
}
}
}
return array();
}
現在我們可以得到Green Turtle
的所有孩子並輸出它們。
$green_turtle = get_children_of($animals, 'Green Turtle');
parse_array($green_turtle);
輸出是:
- Green Turtle With Brown Tail
編輯:既然你說你是停留在那個奇怪的格式輸入數組是,這裏是將轉換您的陣列功能轉換爲上面指定的格式:
function convert_array($array) {
$new_array = array();
$keys = array_keys($array);
foreach($keys as $key) {
$level = explode('-', $key);
$cur_level = &$new_array;
$cur_key = '';
foreach($level as $o_key) {
$cur_key = ltrim($cur_key . '-' . $o_key, '-');
$next_key = $cur_key . '-1';
$value = $array[$cur_key];
$has_child = array_key_exists($next_key, $array);
if($has_child) {
if(!array_key_exists($value, $cur_level)) {
$cur_level[$value] = array();
}
$cur_level = &$cur_level[$value];
} else {
$cur_level[] = $value;
}
}
}
return $new_array;
}
您正在使用類型數組來處理表格/分層數據。我有預感會有更多(龜,犰狳,iquana),並且遞歸可能會繼續(與雀斑,尾巴真菌)。但是你沒有提到數據庫存儲。我想知道你是否考慮過使用XML?你是否在PHP之外處理過分層數據? (你說你知道這不容易,但是你真的知道它「不容易」嗎?!) – Smandoli 2009-07-09 16:28:20
好吧,我的例子的解決方案將被添加到一個更大的類,這是一種文本解析器,我需要從文本中編寫這個樹,在這裏和那裏寫一個大的文本字段(數據庫),用戶不必編寫那些1-1-2的東西,但它是從另一個讀取文本並理解它的函數生成的,然後給這個數組。所以這是不可能考慮xml在這裏我認爲.. – 2009-07-09 17:05:19