我的数据库中有一些路径
mylist/folder1/horse/fred
mylist/folder1/cat/john
mylist/folder2/cat/sam
mylist/folder2/cat/cat/john
我正在创建一个具有树结构的数组:
function explodeTree($array, $delimiter = "_", $baseval = false) {
if(!is_array($array)) return false;
$splitRE = "/" . preg_quote($delimiter, "/") . "/";
$returnArr = array();
foreach ($array as $key => $val) {
$parts = preg_split($splitRE, $key, -1, PREG_SPLIT_NO_EMPTY);
$leafPart = array_pop($parts);
$parentArr = &$returnArr;
foreach ($parts as $part) {
if (!isset($parentArr[$part])) {
$parentArr[$part] = array();
} elseif (!is_array($parentArr[$part])) {
if ($baseval) {
$parentArr[$part] = array("__base_val" => $parentArr[$part]);
} else {
$parentArr[$part] = array();
}
}
$parentArr = &$parentArr[$part];
}
if (empty($parentArr[$leafPart])) {
$parentArr[$leafPart] = $val;
} elseif ($baseval && is_array($parentArr[$leafPart])) {
$parentArr[$leafPart]["__base_val"] = $val;
}
}
return $returnArr;
}
$sql = "SELECT path, path FROM mylist WHERE id = ?";
$q = $pdo->prepare($sql);
$q->execute([$id]);
$array = $q->fetchAll(PDO::FETCH_KEY_PAIR);
$tree = explodeTree($array, "/");
结果是
array(1) {
["mylist"]=>
array(2) {
["folder1"]=>
array(2) {
["horse"]=>
array(1) {
["fred"]=>
string(30) "mylist/folder1/horse/fred"
}
["cat"]=>
array(1) {
["john"]=>
string(28) "mylist/folder1/cat/john"
}
}
["folder2"]=>
array(1) {
["cat"]=>
array(2) {
["sam"]=>
string(27) "mylist/folder2/cat/sam"
["cat"]=>
array(1) {
["john"]=>
string(32) "mylist/folder2/cat/cat/john"
}
}
}
}
}
是否可以为每个阵列提供唯一标识符?
这很重要,因为稍后我需要查找特定数组cat
的示例。但cat
存在多次,现在我无法识别我正在寻找的cat
。
答案 0 :(得分:0)
您必须将petID
作为索引放在sql_query之后的数组中。
while ($row = $this->stmt->fetch()) {
$pet_array[$row[petID]] = $row;
}
对于仅有2个选定列,您可以在已完全提取的array_column()
上使用while
代替$pet_array
循环。
https://github.com/illuminate/routing/blob/master/Route.php
$pet_array = array_column($pet_array, 'cat', 'petID'); // this will only hold $arr[petID] = 'Fred'; so no paths, etc.
答案 1 :(得分:0)
function explodeTree($array, $delimiter = "_", $baseval = false) {
if(empty($array)) return false; // checks for false, null, 0, "0", and empty array
$splitRE = "/" . preg_quote($delimiter, "/") . "/";
$returnArr = array();
foreach ($array as $key => $val) {
$parts = preg_split($splitRE, $val['path'], -1, PREG_SPLIT_NO_EMPTY);
$returnArr[$val['id']] = $parts;
//$returnArr[$val['id']] = ARRAY('mylist'=>$parts[0], 'folder'=>$parts[1], 'pet'=>$parts[2], 'name'=>$parts[3]); // does only work for exactly for items (of same category)
}
return $returnArr;
}
现在,如果你想了解例如使用pet
的{{1}},您可以这样做:
petID=4