比如一個數組裡包括地名,你已經知道了石家莊,怎麼知道它的上級河北。或者你已經知道了北京,怎麼知道它的上級中國
回複內容:
比如一個數組裡包括地名,你已經知道了石家莊,怎麼知道它的上級河北。或者你已經知道了北京,怎麼知道它的上級中國
用id做數組的鍵 每項裡麵包括parent_id
最近剛好寫了一份擷取n維數組某個節點的深度和父級節點的代碼,希望對題主有用
class ArrayUtil { /** * 深度優先遍曆尋找一個樹形結構中,某個節點的所在位置 * * 參數例子: * $input: [ * 'a' => [ * 'b' => [ * 'c' => [] * ] * ], * 'd' => [ * ] * ] * $target: c * 傳回值: [3, ['a','b','c']] * * 可以用list($level, $pathKeys) = self::getNodeLevel(....)來進行使用 * $level展示層級 * $pathKeys表示訪問到這個節點需要經過的key * * @param array $input 輸入 * @param string $target 希望尋找的節點(key或者value),例如 'f' * @param array $pathKeys 節點數組列表 * @return null|array [$level, [$pathKey0, $pathKey1, ...]] 沒有找到時會返回空 */ public static function getNodeLevel(array $input, $target, array $pathKeys = []) { foreach ($input as $key => $val) { $pathKeys[] = $key; if ($key == $target) { return [count($pathKeys), $pathKeys]; } elseif (is_array($val)) { //當前範圍沒有找到值,遞迴進入下一層 $result = self::getNodeLevel($val, $target, $pathKeys); if ($result) { return $result; } } array_pop($pathKeys); } return null; }}
使用:
$input = [ 'a' => [ 'b' => [ 'c' => ['hello', 'world'] ] ], 'd' => [ ]];list($depth, $parents) = ArrayUtil::getNodeLevel($input, 'c');print_r($depth); //層級,輸出3echo "\n";print_r($parents);/*父級節點,輸出Array( [0] => a [1] => b [2] => c)*///獲得目標節點的子數組$target = &$input;foreach ($parents as $key) { $target = &$target[$key];}print_r($target);/*輸出子節點Array( [0] => hello [1] => world)*/
代碼在哪裡?