[英]How to build a multidimensional array tree from an associative array in PHP?
我試圖通過用它們各自的鍵“bandnumber”數組替換“s”和“d”鍵字符串值來從關聯數組構建多維數組樹,但似乎無法破解它。 我只能使它適用於陣列的第一個節點。
例如,我有以下數組:
$coiArray = array (
array('bandnumber' => '02-BELG-2129929', 's' =>'94-BELG-3237180', 'd' => '96-BELG-3156295' ),
array('bandnumber' => '94-BELG-3237180', 's' =>'88-BELG-3206112', 'd' => '88-BELG-3206173' ),
array('bandnumber' => '88-BELG-3206112', 's' =>'81-BELG-3238253', 'd' => '87-BELG-3008002' ),
array('bandnumber' => '88-BELG-3206173', 's' =>'', 'd' => '' ),
array('bandnumber' => '96-BELG-3156295', 's' =>'88-BELG-3206112', 'd' => '85-BELG-3049648' ),
array('bandnumber' => '85-BELG-3049648', 's' =>'', 'd' => '' ),
array('bandnumber' => '81-BELG-3238253', 's' =>'', 'd' => '' ),
array('bandnumber' => '87-BELG-3008002', 's' =>'', 'd' => '' ),
);
我正在嘗試以編程方式將上述數組轉換為以下多維數組樹:
$coiNestedArray = array('bandnumber' => '02-BELG-2129929',
's' => array('bandnumber' => '94-BELG-3237180',
's' => array('bandnumber' => '88-BELG-3206112',
's' => array('bandnumber' => '81-BELG-3238253',
's' =>'',
'd' => ''
),
'd' => array('bandnumber' => '87-BELG-3008002',
's' =>'',
'd' => ''
)
),
'd' => array('bandnumber' => '88-BELG-3206173',
's' =>'',
'd' => ''
)
),
'd' => array('bandnumber' => '96-BELG-3156295',
's' => array('bandnumber' => '88-BELG-3206112',
's' => array('bandnumber' => '81-BELG-3238253',
's' =>'',
'd' => ''
),
'd' => array('bandnumber' => '87-BELG-3008002',
's' =>'',
'd' => ''
)
),
'd' => array('bandnumber' => '85-BELG-3049648',
's' =>'',
'd' => ''
)
)
);
這是我迄今為止最接近的,但它只更新數組的第一個節點:
function findKey($coiarray, $bandnumber){
$thisCol = array_column($coiarray, 'bandnumber');
$found_key = array_search($bandnumber, $thisCol);
return $found_key;
}
foreach ($coiArray as $key => $value) {
$s = '';
$found_key = findKey($coiArray,$coiArray[$key]['s']);
if(isset($coiArray[$found_key])){
$s = $coiArray[$found_key];
}
$d = '';
$found_key = findKey($coiArray,$coiArray[$key]['d']);
if(isset($coiArray[$found_key])) {
$d = $coiArray[$found_key];
}
$coiArray[$key] = array('bandnumber' => $coiArray[$key]['bandnumber'], 's' => $s, 'd' => $d );
}
我將在這里發布數組的整個轉儲重新構建,但這是$coiArray
的第一個節點,來自var_dump($coiArray)
,您會注意到所有最內層嵌套的 ["s"] 和 [" d"] 鍵是字符串而不是它們各自的數組。
[0]=>
array(3) {
["bandnumber"]=>
string(15) "02-BELG-2129929"
["s"]=>
array(3) {
["bandnumber"]=>
string(15) "94-BELG-3237180"
["s"]=>
string(15) "88-BELG-3206112"
["d"]=>
string(15) "88-BELG-3206173"
}
["d"]=>
array(3) {
["bandnumber"]=>
string(15) "96-BELG-3156295"
["s"]=>
string(15) "88-BELG-3206112"
["d"]=>
string(15) "85-BELG-3049648"
}
}
下面的示例是我手動創建的$coiNestedArray
的第一個節點,以說明我要實現的目標。 請注意,每個 ["s"] 和 ["d"] 都是一個數組,派生自$coiArray
。
array(3) {
["bandnumber"]=>
string(15) "02-BELG-2129929"
["s"]=>
array(3) {
["bandnumber"]=>
string(15) "94-BELG-3237180"
["s"]=>
array(3) {
["bandnumber"]=>
string(15) "88-BELG-3206112"
["s"]=>
array(3) {
["bandnumber"]=>
string(15) "81-BELG-3238253"
["s"]=>
string(0) ""
["d"]=>
string(0) ""
}
["d"]=>
array(3) {
["bandnumber"]=>
string(15) "87-BELG-3008002"
["s"]=>
string(0) ""
["d"]=>
string(0) ""
}
}
["d"]=>
array(3) {
["bandnumber"]=>
string(15) "88-BELG-3206173"
["s"]=>
string(0) ""
["d"]=>
string(0) ""
}
}
我該如何解決這個問題?
您需要創建一個以bandnumbers 為鍵的關聯數組,以便您可以直接按bandnumbers 查找行。 然后訪問子項並通過引用將每個子項替換為該關聯數組中的相應值。
可選地檢測哪個bandnumber從未作為孩子被引用:它是根。 但是,如果您知道根頻帶編號,或者您知道它始終是第一個輸入行中的那個,那么您可以跳過最后一步。 最后提取該根的值(假設正好有一個):
// Key the rows by their bandnumber:
foreach($coiArray as $row) {
$hash[$row["bandnumber"]] = $row;
}
foreach($hash as &$row) {
// Replace children with the corresponding row in the hash
foreach(["s","d"] as $prop) {
$child = $row[$prop];
if (!isset($hash[$child])) continue;
$row[$prop] =& $hash[$child];
$children[] = $child; // Keep track of non-root bandnumbers
}
}
// Only needed when you don't know which bandnumber is the root:
$root = current(array_diff(array_keys($hash), $children, ["s","d"]));
$result = $hash[$root];
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.