我正在构建一组嵌套类别。我确实完成了我需要的关键根,但问题是我得到的不是预期的数组。也许代码完全解释了我的意思:
$new_subcat = null;
// Explode the subcategory field to retrieve all the tree
$new_subcategories = explode($separator, $subcategory_name);
// For each element in the tree, search it in the results
// array and if not found, create the new category and
// update the results array
for ($i = 0; $i < count($new_subcategories); $i++)
{
$new_subcategories[$i] = ucwords(strtolower(trim($new_subcategories[$i])));
if (($new_subcat = $this->checkCategory($cat_array, is_null($new_subcat) ? $id_parent : $new_subcat->id, $new_subcategories[$i], $max_cat_id, $new_category_counter)) === false)
continue;
$layers = $category_name.'][subcategories]';
for ($j = 0; $j <= $i; $j++)
{
$layers .= '['.$new_subcategories[$j].']';
if ($j < $i)
$layers .= '[subcategories]';
}
$layers .= '[id';
$results{$layers} = $new_subcat->id;
}
这是print_r($results);
的结果
Array
(
[Cartoleria] => Array
(
[id] => 13
)
[Cartoleria][subcategories][Accessori][id] => 14
[Cartoleria][subcategories][Accessori][subcategories][Scuola][id] => 15
[Cartoleria][subcategories][Accessori][subcategories][Scuola][subcategories][Disegno][id] => 16
[Cartoleria][subcategories][Accessori][subcategories][Scuola][subcategories][Scrittura][id] => 17
[Cartoleria][subcategories][Blocchi E Quaderni][id] => 18
[Cartoleria][subcategories][Buste E Cartelle][id] => 19
[Cartoleria][subcategories][Buste E Cartelle][subcategories][Buste][id] => 20
[Cartoleria][subcategories][Buste E Cartelle][subcategories][Cartelle Morbide][id] => 21
[Cartoleria][subcategories][Buste E Cartelle][subcategories][Cartelle Rigide][id] => 22
[Cartoleria][subcategories][Buste E Cartelle][subcategories][Raccoglitori][id] => 23
[Cartoleria][subcategories][Carta][id] => 24
[Cartoleria][subcategories][Carta][subcategories][Risme E Confezioni][id] => 25
[Cartoleria][subcategories][Etichette Adesive][id] => 26
[Cartoleria][subcategories][Lapis E Matite][id] => 27
[Cartoleria][subcategories][Lapis E Matite][subcategories][Lapis][id] => 28
[Cartoleria][subcategories][Lapis E Matite][subcategories][Matite][id] => 29
[Cartoleria][subcategories][Nastri Adesivi E Colle][id] => 30
[Cartoleria][subcategories][Penne E Pennarelli][id] => 31
[Cartoleria][subcategories][Penne E Pennarelli][subcategories][Evidenziatori][id] => 32
[Cartoleria][subcategories][Penne E Pennarelli][subcategories][Pennarelli][id] => 33
[Cartoleria][subcategories][Penne E Pennarelli][subcategories][Penne][id] => 34
[Informatica] => Array
(
[id] => 35
)
[Informatica][subcategories][Accessori][id] => 36
[Informatica][subcategories][Accessori][subcategories][Alimentatori E Ups][id] => 37
[Informatica][subcategories][Accessori][subcategories][Batterie E Pile][id] => 38
[Informatica][subcategories][Accessori][subcategories][Box, Docking Station E Adattatori][id] => 39
[Informatica][subcategories][Accessori][subcategories][Casse Audio][id] => 40
[Informatica][subcategories][Accessori][subcategories][Cavi][id] => 41
[Informatica][subcategories][Accessori][subcategories][Cavi][subcategories][Alimentazione][id] => 42
[Informatica][subcategories][Accessori][subcategories][Cavi][subcategories][Monitor][id] => 43
[Informatica][subcategories][Accessori][subcategories][Cavi][subcategories][Prolunghe E Multiprese][id] => 44
[Informatica][subcategories][Accessori][subcategories][Cavi][subcategories][Rete][id] => 45
[Informatica][subcategories][Accessori][subcategories][Cavi][subcategories][Usb][id] => 46
[Informatica][subcategories][Accessori][subcategories][Cuffie, Microfoni E Web Cam][id] => 47
[Informatica][subcategories][Accessori][subcategories][Hub E Switch][id] => 48
[Informatica][subcategories][Accessori][subcategories][Mouse E Tastiere][id] => 49
[Informatica][subcategories][Accessori][subcategories][Mouse E Tastiere][subcategories][Kit][id] => 50
[Informatica][subcategories][Accessori][subcategories][Mouse E Tastiere][subcategories][Mouse][id] => 51
[Informatica][subcategories][Accessori][subcategories][Mouse E Tastiere][subcategories][Tastiere][id] => 52
[Informatica][subcategories][Accessori][subcategories][Mouse Pad][id] => 53
[Informatica][subcategories][Accessori][subcategories][Notebook][id] => 54
[Informatica][subcategories][Accessori][subcategories][Notebook][subcategories][Basi Raffreddanti][id] => 55
[Informatica][subcategories][Accessori][subcategories][Periferiche Di Rete][id] => 56
[Informatica][subcategories][Accessori][subcategories][Pulizia E Manutenzione][id] => 57
[Informatica][subcategories][Accessori][subcategories][Supporti Di Memoria][id] => 58
[Informatica][subcategories][Accessori][subcategories][Supporti Di Memoria][subcategories][Accessori][id] => 59
[Informatica][subcategories][Accessori][subcategories][Supporti Di Memoria][subcategories][Accessori][subcategories][Buste E Custodie][id] => 60
[Informatica][subcategories][Accessori][subcategories][Supporti Di Memoria][subcategories][Dischi Esterni][id] => 61
[Informatica][subcategories][Accessori][subcategories][Supporti Di Memoria][subcategories][Pennette Usb][id] => 62
[Informatica][subcategories][Accessori][subcategories][Supporti Di Memoria][subcategories][Supporti Ottici][id] => 63
[Informatica][subcategories][Componenti][id] => 64
[Informatica][subcategories][Componenti][subcategories][Alimentatori][id] => 65
[Informatica][subcategories][Componenti][subcategories][Batterie][id] => 66
[Informatica][subcategories][Componenti][subcategories][Case][id] => 67
[Informatica][subcategories][Componenti][subcategories][Cpu][id] => 68
[Informatica][subcategories][Componenti][subcategories][Hard Disc][id] => 69
[Informatica][subcategories][Componenti][subcategories][Lettori E Masterizzatori][id] => 70
[Informatica][subcategories][Componenti][subcategories][Memorie][id] => 71
[Informatica][subcategories][Componenti][subcategories][Memorie][subcategories][Pc Desktop][id] => 72
[Informatica][subcategories][Componenti][subcategories][Schede Madri][id] => 73
[Informatica][subcategories][Computer][id] => 74
[Informatica][subcategories][Computer][subcategories][Notebook][id] => 75
[Informatica][subcategories][Monitor][id] => 76
[Informatica][subcategories][Software][id] => 77
[Informatica][subcategories][Software][subcategories][Antivirus][id] => 78
[Informatica][subcategories][Software][subcategories][Sistemi Operativi][id] => 79
[Informatica][subcategories][Stampanti][id] => 80
[Informatica][subcategories][Stampanti][subcategories][Accessori][id] => 81
[Informatica][subcategories][Stampanti][subcategories][Accessori][subcategories][Cartucce E Toner][id] => 82
[Informatica][subcategories][Stampanti][subcategories][Accessori][subcategories][Cartucce E Toner][subcategories][Cartucce][id] => 83
[Informatica][subcategories][Stampanti][subcategories][Accessori][subcategories][Cartucce E Toner][subcategories][Toner][id] => 84
[Telefonia] => Array
(
[id] => 85
)
[Telefonia][subcategories][Accessori][id] => 86
[Telefonia][subcategories][Accessori][subcategories][Cavi E Adattatori][id] => 87
[Telefonia][subcategories][Accessori][subcategories][Cuffie E Microfoni][id] => 88
[Telefonia][subcategories][Accessori][subcategories][Custodie E Cover][id] => 89
[Telefonia][subcategories][Accessori][subcategories][Custodie E Cover][subcategories][Tablet][id] => 90
[Telefonia][subcategories][Accessori][subcategories][Memorie Esterne][id] => 91
[Tv] => Array
(
[id] => 92
)
[Tv][subcategories][Accessori][id] => 93
[Tv][subcategories][Accessori][subcategories][Tv][id] => 94
)
当然,在我在这里展示的代码之前,主要类别被放入数组中。看起来php认为{$layers}
完全是一个字符串,所以只考虑一个没有方括号的单个密钥。
如何修改上面的代码以获得真正的数组?
非常感谢。
[编辑]
@Halcyon这里是var_dump:
array(82) {
["Cartoleria"]=>
array(1) {
["id"]=>
string(2) "13"
}
["Cartoleria][subcategories][Accessori][id"]=>
int(14)
["Cartoleria][subcategories][Accessori][subcategories][Scuola][id"]=>
int(15)
["Cartoleria][subcategories][Accessori][subcategories][Scuola][subcategories][Disegno][id"]=>
string(2) "16"
["Cartoleria][subcategories][Accessori][subcategories][Scuola][subcategories][Scrittura][id"]=>
string(2) "17"
["Cartoleria][subcategories][Blocchi E Quaderni][id"]=>
string(2) "18"
["Cartoleria][subcategories][Buste E Cartelle][id"]=>
int(19)
["Cartoleria][subcategories][Buste E Cartelle][subcategories][Buste][id"]=>
string(2) "20"
["Cartoleria][subcategories][Buste E Cartelle][subcategories][Cartelle Morbide][id"]=>
string(2) "21"
["Cartoleria][subcategories][Buste E Cartelle][subcategories][Cartelle Rigide][id"]=>
string(2) "22"
["Cartoleria][subcategories][Buste E Cartelle][subcategories][Raccoglitori][id"]=>
string(2) "23"
["Cartoleria][subcategories][Carta][id"]=>
string(2) "24"
["Cartoleria][subcategories][Carta][subcategories][Risme E Confezioni][id"]=>
string(2) "25"
["Cartoleria][subcategories][Etichette Adesive][id"]=>
string(2) "26"
["Cartoleria][subcategories][Lapis E Matite][id"]=>
int(27)
["Cartoleria][subcategories][Lapis E Matite][subcategories][Lapis][id"]=>
string(2) "28"
["Cartoleria][subcategories][Lapis E Matite][subcategories][Matite][id"]=>
string(2) "29"
["Cartoleria][subcategories][Nastri Adesivi E Colle][id"]=>
string(2) "30"
["Cartoleria][subcategories][Penne E Pennarelli][id"]=>
int(31)
["Cartoleria][subcategories][Penne E Pennarelli][subcategories][Evidenziatori][id"]=>
string(2) "32"
["Cartoleria][subcategories][Penne E Pennarelli][subcategories][Pennarelli][id"]=>
string(2) "33"
["Cartoleria][subcategories][Penne E Pennarelli][subcategories][Penne][id"]=>
string(2) "34"
["Informatica"]=>
array(1) {
["id"]=>
string(2) "35"
}
["Informatica][subcategories][Accessori][id"]=>
int(36)
["Informatica][subcategories][Accessori][subcategories][Alimentatori E Ups][id"]=>
string(2) "37"
["Informatica][subcategories][Accessori][subcategories][Batterie E Pile][id"]=>
string(2) "38"
["Informatica][subcategories][Accessori][subcategories][Box, Docking Station E Adattatori][id"]=>
string(2) "39"
["Informatica][subcategories][Accessori][subcategories][Casse Audio][id"]=>
string(2) "40"
["Informatica][subcategories][Accessori][subcategories][Cavi][id"]=>
int(41)
["Informatica][subcategories][Accessori][subcategories][Cavi][subcategories][Alimentazione][id"]=>
string(2) "42"
["Informatica][subcategories][Accessori][subcategories][Cavi][subcategories][Monitor][id"]=>
string(2) "43"
["Informatica][subcategories][Accessori][subcategories][Cavi][subcategories][Prolunghe E Multiprese][id"]=>
string(2) "44"
["Informatica][subcategories][Accessori][subcategories][Cavi][subcategories][Rete][id"]=>
string(2) "45"
["Informatica][subcategories][Accessori][subcategories][Cavi][subcategories][Usb][id"]=>
string(2) "46"
["Informatica][subcategories][Accessori][subcategories][Cuffie, Microfoni E Web Cam][id"]=>
string(2) "47"
["Informatica][subcategories][Accessori][subcategories][Hub E Switch][id"]=>
string(2) "48"
["Informatica][subcategories][Accessori][subcategories][Mouse E Tastiere][id"]=>
int(49)
["Informatica][subcategories][Accessori][subcategories][Mouse E Tastiere][subcategories][Kit][id"]=>
string(2) "50"
["Informatica][subcategories][Accessori][subcategories][Mouse E Tastiere][subcategories][Mouse][id"]=>
string(2) "51"
["Informatica][subcategories][Accessori][subcategories][Mouse E Tastiere][subcategories][Tastiere][id"]=>
string(2) "52"
["Informatica][subcategories][Accessori][subcategories][Mouse Pad][id"]=>
string(2) "53"
["Informatica][subcategories][Accessori][subcategories][Notebook][id"]=>
string(2) "54"
["Informatica][subcategories][Accessori][subcategories][Notebook][subcategories][Basi Raffreddanti][id"]=>
string(2) "55"
["Informatica][subcategories][Accessori][subcategories][Periferiche Di Rete][id"]=>
string(2) "56"
["Informatica][subcategories][Accessori][subcategories][Pulizia E Manutenzione][id"]=>
string(2) "57"
["Informatica][subcategories][Accessori][subcategories][Supporti Di Memoria][id"]=>
int(58)
["Informatica][subcategories][Accessori][subcategories][Supporti Di Memoria][subcategories][Accessori][id"]=>
string(2) "59"
["Informatica][subcategories][Accessori][subcategories][Supporti Di Memoria][subcategories][Accessori][subcategories][Buste E Custodie][id"]=>
string(2) "60"
["Informatica][subcategories][Accessori][subcategories][Supporti Di Memoria][subcategories][Dischi Esterni][id"]=>
string(2) "61"
["Informatica][subcategories][Accessori][subcategories][Supporti Di Memoria][subcategories][Pennette Usb][id"]=>
string(2) "62"
["Informatica][subcategories][Accessori][subcategories][Supporti Di Memoria][subcategories][Supporti Ottici][id"]=>
string(2) "63"
["Informatica][subcategories][Componenti][id"]=>
int(64)
["Informatica][subcategories][Componenti][subcategories][Alimentatori][id"]=>
string(2) "65"
["Informatica][subcategories][Componenti][subcategories][Batterie][id"]=>
string(2) "66"
["Informatica][subcategories][Componenti][subcategories][Case][id"]=>
string(2) "67"
["Informatica][subcategories][Componenti][subcategories][Cpu][id"]=>
string(2) "68"
["Informatica][subcategories][Componenti][subcategories][Hard Disc][id"]=>
string(2) "69"
["Informatica][subcategories][Componenti][subcategories][Lettori E Masterizzatori][id"]=>
string(2) "70"
["Informatica][subcategories][Componenti][subcategories][Memorie][id"]=>
string(2) "71"
["Informatica][subcategories][Componenti][subcategories][Memorie][subcategories][Pc Desktop][id"]=>
string(2) "72"
["Informatica][subcategories][Componenti][subcategories][Schede Madri][id"]=>
string(2) "73"
["Informatica][subcategories][Computer][id"]=>
string(2) "74"
["Informatica][subcategories][Computer][subcategories][Notebook][id"]=>
string(2) "75"
["Informatica][subcategories][Monitor][id"]=>
string(2) "76"
["Informatica][subcategories][Software][id"]=>
int(77)
["Informatica][subcategories][Software][subcategories][Antivirus][id"]=>
string(2) "78"
["Informatica][subcategories][Software][subcategories][Sistemi Operativi][id"]=>
string(2) "79"
["Informatica][subcategories][Stampanti][id"]=>
int(80)
["Informatica][subcategories][Stampanti][subcategories][Accessori][id"]=>
int(81)
["Informatica][subcategories][Stampanti][subcategories][Accessori][subcategories][Cartucce E Toner][id"]=>
int(82)
["Informatica][subcategories][Stampanti][subcategories][Accessori][subcategories][Cartucce E Toner][subcategories][Cartucce][id"]=>
string(2) "83"
["Informatica][subcategories][Stampanti][subcategories][Accessori][subcategories][Cartucce E Toner][subcategories][Toner][id"]=>
string(2) "84"
["Telefonia"]=>
array(1) {
["id"]=>
string(2) "85"
}
["Telefonia][subcategories][Accessori][id"]=>
int(86)
["Telefonia][subcategories][Accessori][subcategories][Cavi E Adattatori][id"]=>
string(2) "87"
["Telefonia][subcategories][Accessori][subcategories][Cuffie E Microfoni][id"]=>
string(2) "88"
["Telefonia][subcategories][Accessori][subcategories][Custodie E Cover][id"]=>
string(2) "89"
["Telefonia][subcategories][Accessori][subcategories][Custodie E Cover][subcategories][Tablet][id"]=>
string(2) "90"
["Telefonia][subcategories][Accessori][subcategories][Memorie Esterne][id"]=>
string(2) "91"
["Tv"]=>
array(1) {
["id"]=>
string(2) "92"
}
["Tv][subcategories][Accessori][id"]=>
string(2) "93"
["Tv][subcategories][Accessori][subcategories][Tv][id"]=>
string(2) "94"
}
@DaliborKarlović这正是我的问题!
也许我以错误的方式采用了所有逻辑,所以我试着更好地解释我需要做什么: 我在xml文件中列出了许多产品。每个产品都有一个标签'Category',可能有一个标签'Subcategory'。 “子类别”标签可以为空,仅包含一个子类别或多个由特定字符分隔的子类别(即:
<Subcategory></Subcategory
; <Subcategory>SubCat1</Subcategory>
; <Subcategory>SubCat1 » SubCat2 » SubCat3</Subcategory>
)
此时,我解析了搜索“Category”标签的xml文件,并开始以$results
形式构建我的$results[$category_name]['id'] = $id
数组。在同一个循环中,我还搜索“子类别”标签,如果我找到它们并且它们不是空的,我会用»
将它们分解。现在我需要以如下形式构建$results
数组:
$results = Array
(
[Cartoleria] => Array //Cartoleria comes from a 'Category' tag
(
[id] => 13
[subcategories] => Array
(
[SubCat1] => Array
(
[id] => 14
[subcategories] => Array
(
[SubCat2] => Array
(
[id] => 15
[subcategories] => Array
(
[SubCat3] => Array
(
[id] => 16
)
)
)
)
)
)
)
)
答案 0 :(得分:0)
你基本上创建了一个不包含嵌套数组的数组,而只是只有一个级别,而且LOOK就像它们在print_r()
输出之外一样。
您需要做的是创建真正的嵌套数组。
答案 1 :(得分:0)
我解决了通过引用数组创建指针。下面我更好地解释自己。
解析xml时,对于我搜索<Category>
元素的每个产品,如果不存在则创建类别,否则返回类别实例。现在我指定$results[$category_name]['id'] = $new_cat->id;
。
如果<Subcategory>
元素中几乎存在一个子类别,我指定$results[$category_name]['subcategories'] = array();
。
这是剩余的完整代码:
$new_subcat = null;
// Add $pointer as a reference pointer
$pointer =& $results[$category_name]['subcategories'];
// Explode the subcategory field to retrieve all the tree
$new_subcategories = explode($separator, $subcategory_name);
// For each element in the tree, search it in the results
// array and if not found, create the new category and
// update the results array
for ($i = 0; $i < count($new_subcategories); $i++)
{
$new_subcategories[$i] = ucwords(strtolower(trim($new_subcategories[$i])));
if (($new_subcat = $this->checkCategory($cat_array, empty($new_subcat) ? $id_parent : $new_subcat->id, $new_subcategories[$i], $max_cat_id, $new_category_counter)) === false)
continue;
// if $new_subcategories[$i] occurs for the first time at this level
// of the array, register it with the relative id
if (!isset($pointer[$new_subcategories[$i]]['id']))
$pointer[$new_subcategories[$i]]['id'] = $new_subcat->id;
// if this is not the last loop ...
if ($i != count($new_subcategories) - 1)
{
// if not exist the key 'subcategories' for the subcategory we
// are working on create it as an empty array
if (!isset($pointer[$new_subcategories[$i]]['subcategories']))
$pointer[$new_subcategories[$i]]['subcategories'] = array();
// update the pointer to point at the key 'subcategories' of the
// current subcategory
$pointer =& $pointer[$new_subcategories[$i]]['subcategories'];
}
}
上面的代码当然是在foreach循环中,所以最后,指针被重置为$pointer =& $results[$category_name]['subcategories'];
,这导致了预期的数组数组:
Array
(
[Cartoleria] => Array
(
[id] => 13
[subcategories] => Array
(
[Accessori] => Array
(
[id] => 14
[subcategories] => Array
(
[Scuola] => Array
(
[id] => 15
[subcategories] => Array
(
[Disegno] => Array
(
[id] => 16
)
[Scrittura] => Array
(
[id] => 17
)
)
)
)
)
[Blocchi E Quaderni] => Array
(
[id] => 18
)
[Buste E Cartelle] => Array
(
[id] => 19
[subcategories] => Array
(
[Buste] => Array
(
[id] => 20
)
[Cartelle Morbide] => Array
(
[id] => 21
)
[Cartelle Rigide] => Array
(
[id] => 22
)
[Raccoglitori] => Array
(
[id] => 23
)
)
)
[Carta] => Array
(
[id] => 24
[subcategories] => Array
(
[Risme E Confezioni] => Array
(
[id] => 25
)
)
)
[Etichette Adesive] => Array
(
[id] => 26
)
[Lapis E Matite] => Array
(
[id] => 27
[subcategories] => Array
(
[Lapis] => Array
(
[id] => 28
)
[Matite] => Array
(
[id] => 29
)
)
)
[Nastri Adesivi E Colle] => Array
(
[id] => 30
)
[Penne E Pennarelli] => Array
(
[id] => 31
[subcategories] => Array
(
[Evidenziatori] => Array
(
[id] => 32
)
[Pennarelli] => Array
(
[id] => 33
)
[Penne] => Array
(
[id] => 34
)
)
)
)
)
)