遞歸是對這類問題的答案。不過,如果我們可以對數組的結構某些假設(即「ID」始終是一個沒有孩子的葉節點)有進一步的優化可能:
<?php
$a = array(
'apple'=> array(
'new'=> array(array('id' => 1), array('id' => 2), array('id' => 5)),
'old'=> array(array('id' => 3), array('id' => 4, 'keyname' => 'keyvalue'))
),
);
// When true the complete path has been found.
$complete = false;
function get_path($a, $key, $value, &$path = null) {
global $complete;
// Initialize path array for first call
if (is_null($path)) $path = array();
foreach ($a as $k => $v) {
// Build current path being tested
array_push($path, $k);
// Check for key/value match
if ($k == $key && $v == $value) {
// Complete path found!
$complete= true;
// Remove last path
array_pop($path);
break;
} else if (is_array($v)) {
// **RECURSION** Step down into the next array
get_path($v, $key, $value, $path);
}
// When the complete path is found no need to continue loop iteration
if ($complete) break;
// Teardown current test path
array_pop($path);
}
return $path;
}
var_dump(get_path($a, 'id', 3));
$complete = false;
var_dump(get_path($a, 'id', 2));
$complete = false;
var_dump(get_path($a, 'id', 5));
$complete = false;
var_dump(get_path($a, 'keyname', 'keyvalue'));
嗯,你的意思是一個upheap類的東西? – 2010-07-28 19:47:37