将数组分解为多维数组 (parent->child->sub-child)
Explode Array into Multidimensional Arrays (parent->child->sub-child)
我有一个数组 ($categories_final),看起来类似于:
Array
(
[0] => Accessories/Apron
[1] => Accessories/Banners
[2] => Accessories/Belts
[3] => Brand/Brand1
[4] => Brand/Brand2
[5] => Apparel/Men/Belts
[6] => Apparel/Men/Socks
[7] => Apparel/Women/Leggings
)
我试图让它看起来像这样,这样我就可以将它作为我商店的类别结构添加到数据库中:
Array
(
[Accessories] => Array
(
[0] => Apron
[1] => Banners
[2] => Belts
)
[Apparel] => Array
(
[0] => Men => Array
(
[0] => Belts
[1] => Socks
)
[1] => Women => Array
(
[0] => Leggings
)
)
...etc
这是我目前所知道的,但我无法弄清楚如何在 Men/ & Women/ 下添加 children:
$categories = array();
foreach ($categories_final as $cat) {
$levels = explode('/', $cat);
if (isset($categories[$levels[0]])) {
if (!in_array($levels[1], $categories[$levels[0]])) {
$categories[$levels[0]][]= $levels[1];
}
}
else {
$categories[$levels[0]][]= $levels[1];
}
}
print_r($categories);
同样,我还在研究如何在各自的 parents.
下添加 /Belts、/Socks 和 /Leggings
感谢任何帮助,谢谢!
由于可以有无限数量的分支,您可能应该有一个递归解决方案。我尽了最大努力得到了这段代码:
$arr = ['Accessories/Apron', 'Accessories/Banners', 'Accessories/Belts','Brand/Brand1','Brand/Brand2',
'Apparel/Men/Belts', 'Apparel/Men/Socks', 'Apparel/Women/Leggings'];
$final = [];
foreach ($arr as $branch) {
$temp = branchRecursive($branch);
$final = array_merge_recursive($final, $temp);
}
function branchRecursive($branch) {
// explode only first
$newBranch = explode('/', $branch, 2);
// A leaf, no more branches
if(count($newBranch) != 2) {
return $newBranch[0];
}
$array [ $newBranch[0] ]= branchRecursive($newBranch[1]);
return $array;
}
它returns这个:
Array
(
[Accessories] => Array
(
[0] => Apron
[1] => Banners
[2] => Belts
)
[Brand] => Array
(
[0] => Brand1
[1] => Brand2
)
[Apparel] => Array
(
[Men] => Array
(
[0] => Belts
[1] => Socks
)
[Women] => Leggings
)
)
唯一与您的代码不同的是
[Women] => Leggings
而不是
[0] => Leggings
但我想睡觉,脑子不灵了,所以如果有人能指出要更改的地方,我将不胜感激。我希望这不是什么大问题:)
一种方法是将数组项"convert"转换为json,然后解码为数组。
我首先在中间步骤中使字符串变得无效 json,然后 preg_replace 使内部 {}
变为 []
以使其有效。
然后与结果合并。
$result =[];
foreach($arr as $val){
$count = count(explode("/", $val));
$str = '{"' . str_replace('/', '":{"', $val) . '"}' . str_repeat("}", $count-1);
$json = preg_replace("/(.*)(\{)(.*?)(\})/", "[]", $str);
$result = array_merge_recursive($result, json_decode($json, true));
}
Print_r($result);
此代码使您能够创建任意数量的子分支。
$source = array('Accessories/Apron ' ,
'Accessories/Banners',
'Accessories/Belts',
'Brand/Brand1',
'Brand/Brand2',
'Apparel/Men/Belts',
'Apparel/Men/Socks',
'Apparel/Women/Leggings'
);
function convert($categories_final) {
$categories = array();
foreach ($categories_final as $cat) {
$levels = explode('/', $cat);
// get category
$category_name = $levels[0];
array_shift($levels);
if(!array_key_exists($category_name,$categories)) {
$categories[$category_name] = array();
}
$tmp = &$categories[$category_name] ;
foreach($levels as $index => $val){
if($index + 1 === count($levels) ){
$tmp[] = $val;
} else {
$i = find_index($tmp , $val);
if( $i == count($tmp) ) { // object not found , we create a new sub array
$tmp[] = array($val => array());
}
$tmp = &$tmp[$i][$val];
}
}
}
return $categories;
}
function find_index($array , $key) {
foreach($array as $i => $val ) {
if(is_array($val) && array_key_exists($key , $val) ){
return $i ;
}
}
return count($array);
}
print_r(convert($source));
这是结果
Array
(
[Accessories] => Array
(
[0] => Apron
[1] => Banners
[2] => Belts
)
[Brand] => Array
(
[0] => Brand1
[1] => Brand2
)
[Apparel] => Array
(
[0] => Array
(
[Men] => Array
(
[0] => Belts
[1] => Socks
)
)
[1] => Array
(
[Women] => Array
(
[0] => Leggings
)
)
)
)
我有一个数组 ($categories_final),看起来类似于:
Array
(
[0] => Accessories/Apron
[1] => Accessories/Banners
[2] => Accessories/Belts
[3] => Brand/Brand1
[4] => Brand/Brand2
[5] => Apparel/Men/Belts
[6] => Apparel/Men/Socks
[7] => Apparel/Women/Leggings
)
我试图让它看起来像这样,这样我就可以将它作为我商店的类别结构添加到数据库中:
Array
(
[Accessories] => Array
(
[0] => Apron
[1] => Banners
[2] => Belts
)
[Apparel] => Array
(
[0] => Men => Array
(
[0] => Belts
[1] => Socks
)
[1] => Women => Array
(
[0] => Leggings
)
)
...etc
这是我目前所知道的,但我无法弄清楚如何在 Men/ & Women/ 下添加 children:
$categories = array();
foreach ($categories_final as $cat) {
$levels = explode('/', $cat);
if (isset($categories[$levels[0]])) {
if (!in_array($levels[1], $categories[$levels[0]])) {
$categories[$levels[0]][]= $levels[1];
}
}
else {
$categories[$levels[0]][]= $levels[1];
}
}
print_r($categories);
同样,我还在研究如何在各自的 parents.
下添加 /Belts、/Socks 和 /Leggings感谢任何帮助,谢谢!
由于可以有无限数量的分支,您可能应该有一个递归解决方案。我尽了最大努力得到了这段代码:
$arr = ['Accessories/Apron', 'Accessories/Banners', 'Accessories/Belts','Brand/Brand1','Brand/Brand2',
'Apparel/Men/Belts', 'Apparel/Men/Socks', 'Apparel/Women/Leggings'];
$final = [];
foreach ($arr as $branch) {
$temp = branchRecursive($branch);
$final = array_merge_recursive($final, $temp);
}
function branchRecursive($branch) {
// explode only first
$newBranch = explode('/', $branch, 2);
// A leaf, no more branches
if(count($newBranch) != 2) {
return $newBranch[0];
}
$array [ $newBranch[0] ]= branchRecursive($newBranch[1]);
return $array;
}
它returns这个:
Array
(
[Accessories] => Array
(
[0] => Apron
[1] => Banners
[2] => Belts
)
[Brand] => Array
(
[0] => Brand1
[1] => Brand2
)
[Apparel] => Array
(
[Men] => Array
(
[0] => Belts
[1] => Socks
)
[Women] => Leggings
)
)
唯一与您的代码不同的是
[Women] => Leggings
而不是
[0] => Leggings
但我想睡觉,脑子不灵了,所以如果有人能指出要更改的地方,我将不胜感激。我希望这不是什么大问题:)
一种方法是将数组项"convert"转换为json,然后解码为数组。
我首先在中间步骤中使字符串变得无效 json,然后 preg_replace 使内部 {}
变为 []
以使其有效。
然后与结果合并。
$result =[];
foreach($arr as $val){
$count = count(explode("/", $val));
$str = '{"' . str_replace('/', '":{"', $val) . '"}' . str_repeat("}", $count-1);
$json = preg_replace("/(.*)(\{)(.*?)(\})/", "[]", $str);
$result = array_merge_recursive($result, json_decode($json, true));
}
Print_r($result);
此代码使您能够创建任意数量的子分支。
$source = array('Accessories/Apron ' ,
'Accessories/Banners',
'Accessories/Belts',
'Brand/Brand1',
'Brand/Brand2',
'Apparel/Men/Belts',
'Apparel/Men/Socks',
'Apparel/Women/Leggings'
);
function convert($categories_final) {
$categories = array();
foreach ($categories_final as $cat) {
$levels = explode('/', $cat);
// get category
$category_name = $levels[0];
array_shift($levels);
if(!array_key_exists($category_name,$categories)) {
$categories[$category_name] = array();
}
$tmp = &$categories[$category_name] ;
foreach($levels as $index => $val){
if($index + 1 === count($levels) ){
$tmp[] = $val;
} else {
$i = find_index($tmp , $val);
if( $i == count($tmp) ) { // object not found , we create a new sub array
$tmp[] = array($val => array());
}
$tmp = &$tmp[$i][$val];
}
}
}
return $categories;
}
function find_index($array , $key) {
foreach($array as $i => $val ) {
if(is_array($val) && array_key_exists($key , $val) ){
return $i ;
}
}
return count($array);
}
print_r(convert($source));
这是结果
Array
(
[Accessories] => Array
(
[0] => Apron
[1] => Banners
[2] => Belts
)
[Brand] => Array
(
[0] => Brand1
[1] => Brand2
)
[Apparel] => Array
(
[0] => Array
(
[Men] => Array
(
[0] => Belts
[1] => Socks
)
)
[1] => Array
(
[Women] => Array
(
[0] => Leggings
)
)
)
)