1

I need to dynamically produce child elements of an array, these are arrays them selves. So the end result should be (this is a simplified version of the code below to make it easier to understand):

Array
(
    [id] => 5000038642
    [name] => TrackVia Legacy Section of Array
    [description] => 
    [table_id] => 5000005024
    [records] => Array
        (
            [0] => Array
                (
                    [id] => 1
                    [table_id] => 1
                    [fields] => Array
                        (
                            [Name] => First Item
                        )
                   )
              [1] => Array
                (
                    [id] => 1
                    [table_id] => 1
                    [fields] => Array
                        (
                            [Name] => Second Item
                        )
                   )
        )
)

The nested arrays within Results are produced dynamically from a MySQL table, so >

$allItems = array();
    $item = array();

// Get each result and build the arrya
while($row = $resultAvailableBoxes->fetch_assoc()) {

                $item = array (
                "id"=> $row['id'], 
                "table_id"=> $row['id'], 
                "fields"=> array (
                    "Name"=> $row['box_title'], 
                    )
                );

                // Append the arrays on to each other
                $allItems[] = array_merge($allItems, $item);

    }

// Place the arrays within the "parent" array
$completeArray = array( 
            "id"=> 1000, 
            "name"=> "Sample",
            "description"=> "", 
            "table_id"=> 1000, 
                "records"=> 
                    $allItems

                );

As you can see I am then also trying to append each new array on to the last, before placing those arrays in to the "parent" array. This is where the problems happen.

Using the method

$allItems[] = array_merge($allItems, $item);

I get every array appended on to the last, but then again and again. Like this:

Array
(
    [id] => 5000038642
    [name] => TrackVia Legacy Section of Array
    [description] => 
    [table_id] => 5000005024
    [records] => Array
        (
            [0] => Array
                (
                    [id] => 1
                    [table_id] => 1
                    [fields] => Array
                        (
                            [Name] => Texan BBQ 1
                        )

                )

            [1] => Array
                (
                    [0] => Array
                        (
                            [id] => 1
                            [table_id] => 1
                            [fields] => Array
                                (
                                    [Name] => Texan BBQ 1
                                )

                        )

                    [id] => 9
                    [table_id] => 9
                    [fields] => Array
                        (
                            [Name] => Goan Sorpotel with Pea & Mint Pilau and Tomato Chutney
                        )

                )

        )

)

When I have 20 items, you can see this would become massive list and just doesn't work. Using the method

$allItems = array_merge($allItems, $item);

Returns only the last array being appended (i.e. it always overwrites whats already in the "allItems" array.

I have also used a simple method that I didn't expect to work, and sure enough it didnt:

$allItems .= $item;

I've come to the conclusion after reading these stackover flow questions which seem like the same thing but aren't or give weird results that I must be approaching this all wrong. Is this the wrong method full stop, or is it that I have missed something out to stop the child elements being continually added?

Appending Arrays (Stack Overflow) Can't concatenate 2 arrays in PHP

I've lost count of the other questions I've look at on this, including the PHP manual but I can't find anything more relevant the arrays_merge

Community
  • 1
  • 1
tim.baker
  • 2,807
  • 4
  • 24
  • 48

2 Answers2

1

Try to use $allItems[] = $item; instead of $allItems[] = array_merge($allItems, $item);

bumpy
  • 1,962
  • 2
  • 12
  • 19
1

why don't you just do this?

$items = array();


while($row = $resultAvailableBoxes->fetch_assoc()) {
    $items[] = array (
        "id"=> $row['id'], 
        "table_id"=> $row['id'], 
        "fields"=> array (
            "Name"=> $row['box_title'], 
            )
        );
}

// Place the arrays within the "parent" array
$completeArray = array( 
                "id"=> 1000, 
                "name"=> "Sample",
                "description"=> "", 
                "table_id"=> 1000, 
                "records"=> $items                    
                );

this should create an array with all the items and then add it to the $completeArray

knetsi
  • 1,291
  • 1
  • 15
  • 16