如何为多维数组中的每个数组赋予唯一标识符?

时间:2016-04-07 11:55:25

标签: php arrays multidimensional-array

我的数据库中有一些路径

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

2 个答案:

答案 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