Index: branches/version-2_12-dev/data/class/util/SC_Utils.php
===================================================================
--- branches/version-2_12-dev/data/class/util/SC_Utils.php	(revision 22602)
+++ branches/version-2_12-dev/data/class/util/SC_Utils.php	(revision 22603)
@@ -1969,11 +1969,16 @@
      * @param string $glue_key 親IDキー名
      * @param array $correction 階層構造が含まれている配列
+     * @param boolean $cid_is_key キーがIDの配列の場合はtrue
      * @param integer $root_id ルートID
      * @param boolean $id_only IDだけの配列を返す場合はtrue
      * @return array 親ID配列
      */
-    public static function getTreeTrail($start_id, $primary_key, $glue_key, $correction = array(), $root_id = 0, $id_only = TRUE)
-    {
-        $arrIDToKay = SC_Utils_Ex::makeArrayIDToKey($primary_key, $correction);
+    public static function getTreeTrail($start_id, $primary_key, $glue_key, $correction = array(), $cid_is_key = FALSE, $root_id = 0, $id_only = TRUE)
+    {
+        if ($cid_is_key) {
+            $arrIDToKay = $correction;
+        } else {
+            $arrIDToKay = SC_Utils_Ex::makeArrayIDToKey($primary_key, $correction);
+        }
         $id = $start_id;
         $arrTrail = array();
Index: branches/version-2_12-dev/data/class/helper/SC_Helper_Category.php
===================================================================
--- branches/version-2_12-dev/data/class/helper/SC_Helper_Category.php	(revision 22597)
+++ branches/version-2_12-dev/data/class/helper/SC_Helper_Category.php	(revision 22603)
@@ -71,5 +71,5 @@
     public function getList($cid_to_key = FALSE)
     {
-        static $arrCategory = array();
+        static $arrCategory = array(), $cidIsKey = array();
 
         if (!isset($arrCategory[$this->count_check])) {
@@ -90,6 +90,9 @@
 
         if ($cid_to_key) {
-            // 配列のキーをカテゴリーIDに
-            return SC_Utils_Ex::makeArrayIDToKey('category_id', $arrCategory[$this->count_check]);
+            if (!isset($cidIsKey[$this->count_check])) {
+                // 配列のキーをカテゴリーIDに
+                $cidIsKey[$this->count_check] = SC_Utils_Ex::makeArrayIDToKey('category_id', $arrCategory[$this->count_check]);
+            }
+            return $cidIsKey[$this->count_check];
         }
 
@@ -104,7 +107,10 @@
     public function getTree()
     {
-        $arrList = $this->getList();
-        $arrTree = SC_Utils_Ex::buildTree('category_id', 'parent_category_id', LEVEL_MAX, $arrList);
-        return $arrTree;
+        static $arrTree = array();
+        if (!isset($arrTree[$this->count_check])) {
+            $arrList = $this->getList();
+            $arrTree[$this->count_check] = SC_Utils_Ex::buildTree('category_id', 'parent_category_id', LEVEL_MAX, $arrList);
+        }
+        return $arrTree[$this->count_check];
     }
 
@@ -118,6 +124,6 @@
     public function getTreeTrail($category_id, $id_only = TRUE)
     {
-        $arrCategory = $this->getList();
-        $arrTrailID = SC_Utils_Ex::getTreeTrail($category_id, 'category_id', 'parent_category_id', $arrCategory, 0, $id_only);
+        $arrCategory = $this->getList(TRUE);
+        $arrTrailID = SC_Utils_Ex::getTreeTrail($category_id, 'category_id', 'parent_category_id', $arrCategory, TRUE, 0, $id_only);
         return $arrTrailID;
     }
