2016-04-07 13 views
0

benim veritabanında ben bir ağaç yapısı ile bir dizi oluşturmaHer diziyi çok boyutlu bir dizide benzersiz bir tanımlayıcıya nasıl verebilirim?

mylist/folder1/horse/fred 
mylist/folder1/cat/john 
mylist/folder2/cat/sam 
mylist/folder2/cat/cat/john 

içindeki bazı yolları vardır:

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, "/"); 

sonuç

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" 
     } 
     } 
    } 
    } 
} 

her diziyi vermek mümkün mü benzersiz bir tanımlayıcı mı? Bu önemli çünkü daha sonra cat belirli dizi için örnek aramaya ihtiyacım var. Ancak cat birden fazla kez var ve şu anda hangi cat aradığımı belirleyemiyorum.

+0

Tüm diziler her zaman bir benzersiz bir tanımlayıcı var. Hiyerarşiye dayanan anahtarlar zincirleme. – cpugourou

+0

Dizinin dizini, ör. 'PetID'. Yani dizilerinizin ilk dizini ARRAY () = ARRAY ('kedi', ....) gibi bir şey gibi görünüyor. Herhangi bir evcil hayvana $ arr [$ petID] 'ile doğrudan erişebildiğiniz. – djot

+0

@djot Tamam, seni anladığımda, "$ sql =" SELECT yolunu yazmalıyım, MİLİDİNDEN DOĞRUDAN WHERE id =? "; – Jarla

cevap

0

sql_query'den sonra diziye petID dizinini dizin olarak eklemeniz gerekir.

while ($row = $this->stmt->fetch()) { 
    $pet_array[$row[petID]] = $row; 
} 

sadece 2 Seçilen sütunlar için, $pet_array bir zaten tamamen getirilen yerine while döngü array_column() kullanabilirsiniz. Yani şimdi

http://de2.php.net/manual/en/function.array-column.php

$pet_array = array_column($pet_array, 'cat', 'petID'); // this will only hold $arr[petID] = 'Fred'; so no paths, etc. 
+0

Tam olarak benim fonksiyonumda bunu koymak ister misiniz? – Jarla

+0

Üzgünüm, kayboldum. Benim fonksiyonum için bir örnek verebilir misin? – Jarla

+0

İmho yapabileceğiniz en iyi şey, örn. Farklı veritabanı sütunlarında mylist/folder2/cat/sam'. Bu şekilde bir veritabanı kullanımı mantıklı. Ardından, istediğiniz şeyi seçebilir ve bir 'explodeTree' işlevine gerek duymadan geri döndürebilirsiniz. – djot

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; 
} 

, sen mesela ayrıntılarını almak istiyorsanız petID=4 ile pet, böyle yapabilirsiniz:

$sql = "SELECT id, path FROM mylist WHERE id = ?"; 
$q = $pdo->prepare($sql); 
$q->execute([$id]); 
$array = $q->fetchAll(PDO::FETCH_KEY_PAIR); 
$tree = explodeTree($array, "/"); 
echo 'I am a '.$tree[4]['pet'].', and my name is '.$tree[4]['name']; 
+0

Ben' leaf' şeydir ne elde etmek istediğinizi biliyoruz ve yok. Belki de bu 4 maddelik diziyi 4 tek öğe dizisinde ayırmanız gerekir. Veya 'petID' değerini 5'inci maddeye koymanız ve daha sonra bu 5 maddelik dizide 'petid 'için' array_search' yapmalısınız. – djot

+0

Teşekkürler, yollarım sürekli değişiyor. Yani bazı şeylere örnek vereceğim: 'bithday/colors/blue/clouds'. Çözümünüz hala çalışıyor mu? – Jarla

+0

İşlevinizi test ettim. Ama sonucudur: 'bir dizi (1) { [ "m"] => dizisi (4) { [ "mylist"] => dizisi (1), "m" [ "klasör"] => BOŞ [ "hayvan"] => BOŞ [ "name"] => BOŞ} } ' – Jarla