2017-08-02 153 views
0

我使用WordPress的,有一個自定義後類型的設置與選擇一組號碼,與基本的細分是這樣的:PHP添加到兒童陣列

  • 30" 圓桌會議
    • 自助
    • 雞尾酒
    • 甜品
  • 宴會臺
    • 自助
    • 禮品
    • DJ表

我試圖收集所有物品進入分組的集合,用於<optgroup />使用,以顯示自助下的所有表,所有在雞尾酒等等如下:

  • 自助餐
    • 30" 圓桌會議
    • 宴會桌
  • 雞尾酒
    • 宴會桌

[等等]

PHP的問題我米跑到是我有一個桅杆呃數組,其中包含所有類型(自助餐,雞尾酒等)以及稱爲tables的(初始)空數組元素,以便添加支持該特定類型的所有表。從ACF中檢索選項可以正常工作,就像從WordPress檢索單個帖子一樣,所以這是嚴格的打包問題,以JSON的形式反彈回來。下面是一個代碼示例:

//gets the field associated with the different table types (Buffet, Cocktail, etc.) 
    $field = get_field_object('field_577ff065e6699'); 

    $list = array(); 

    //create the base array 
    foreach ($field["choices"] as $type) { 
     $list[] = array 
        (
        "type"  => $type, //Buffet, Cocktail, etc. 
        "tables" => array() //placeholder to add WP items 
       ); 
    } 

    //now get all tables 
    $tablesQuery = new WP_Query(array('post_type' => 'table', 'posts_per_page' => -1, 'order' => 'ASC')); 

    //loop through and add the table(s) to their categories      
    while ($tablesQuery->have_posts()) : $tablesQuery->the_post(); 

     //gets the types supported by this table 
     $tableTypes = get_field('options'); 

     //individual types 
     foreach ($tableTypes as $tableType) { 

      //all types 
      foreach ($list as $supportedType) { 

       //see if there is a match and add it 
       if ($tableType == $supportedType["type"]) { 
        //add to the array since it matches 
        $table = array 
          (
           "name" => get_the_title(), 
           "sqft" => (int)get_field('square_footage'), 
           "seats" => (int)get_field('seats') 
          ); 

        array_push($supportedType["tables"], $table); 

        //shows the single table above, but nothing prior 
        print_r($supportedType); 
       } 
      } 
     } 

    endwhile; 

    wp_reset_postdata(); 

    //all "tables" arrays are empty here 
    var_dump($list); 

print_r($supportedType)輸出上述最終顯示的所有數據,然而,tables條目總是當它應該是多個只有一個元素:

Array 
(
    [type] => Buffet 
    [tables] => Array 
     (
      [0] => Array 
       (
        [name] => 30」 Round Bistro/Cocktail Table 
        [sqft] => 42 
        [seats] => 2 
       ) 

     ) 

) 
Array 
(
    [type] => Cake 
    [tables] => Array 
     (
      [0] => Array 
       (
        [name] => 30」 Round Bistro/Cocktail Table 
        [sqft] => 42 
        [seats] => 2 
       ) 

     ) 

) 

[.. snip ..] 

最後,當我在最後做var_dump($list),所有類型的出現,但它們的相關tables陣列都是空的:

array(11) { 
    [0]=> 
    array(2) { 
    ["type"]=> 
    string(6) "Buffet" 
    ["tables"]=> 
    array(0) { 
    } 
    } 
    [1]=> 
    array(2) { 
    ["type"]=> 
    string(4) "Cake" 
    ["tables"]=> 
    array(0) { 
    } 
    } 

這讓我完全失去了知覺,儘管它必須是令人難以置信的基本的東西,我錯過了。任何想法爲什麼tables是空的,儘管在環狀物品上使用array_push?我也試過$supportedType["tables"][] = $table,但是這個效果相同。

+0

'$ supportedType'是foreach'的'迭代變量,所以它每次通過循環重新分配到'$ list'數組的當前元素。它也是元素的副本,所以推送到它不會影響原始'$ list'元素。 – Barmar

+0

啊,這是一個副本!只要你這麼說,我知道它需要一個參考變量,在它前面增加一個'&',並且繁榮 - 完美。 @Barmar - 如果你想添加你的答案作爲答案,我會將其標記爲正確的。 – RubyHaus

+1

我以前回答過類似的問題,我把它作爲重複鏈接。 – Barmar

回答

1

我覺得你這個裏面的foreach的數組的拷貝工作:foreach ($list as $supportedType) {

嘗試將其更改爲

foreach ($list as $key => $supportedType) { 
    ... 
    // this operates on the copy 
    // array_push($supportedType["tables"], $table); 
    // operate on the original instead 
    array_push($list[$key]["tables"], $table); 
    ... 
} 
+0

我以爲循環通過引用(而不是複製)進行操作,這就是爲什麼它不起作用。我將'$ supportedType'作爲引用變量,現在它可以工作。雖然謝謝!我認爲這也可以很好地工作。 – RubyHaus