PHP:如何投射“非数组”

时间:2015-06-15 13:45:08

标签: php arrays

我正在构建一组嵌套类别。我确实完成了我需要的关键根,但问题是我得到的不是预期的数组。也许代码完全解释了我的意思:

$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'。 “子类别”标签可以为空,仅包含一个子类别或多个由特定字符分隔的子类别(即:

  1. <Subcategory></Subcategory;
  2. <Subcategory>SubCat1</Subcategory>;
  3. <Subcategory>SubCat1 » SubCat2 » SubCat3</Subcategory>
  4. ) 此时,我解析了搜索“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
                                )
                            )
                        )
                    )
                )
            )
        )
    )
    

2 个答案:

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