Dean
Dean

Reputation: 211

Create Nested arrays from sequential arrays in PHP

I need help sorting arrays in PHP. I'm receiving these arrays like so:

Array (
    [0] => Array (
        [0] => Array (
            [id] => 1
            [username] => STLUserFolks
            [event_id] => 7e0a2faa-43c8-4552-b0ec-c4d0fa6c00d1
            [event_on] => 2020-06-29 17:39:25.93432
            [ent_pix] =>
            [\"images/events/STLUserFolks/tammy1.jpeg\",\"images/events/STLUserFolks/tammy2.jpeg\",\"images/events/STLUserFolks/tammy3.jpeg\",\"images/events/STLUserFolks/tammy4.jpeg\",\"images/events/STLUserFolks/tammy5.jpeg\",\"images/events/STLUserFolks/tammy6.jpeg\"]
            [amount] => 20
            [event_title] => Fun on vacation with friends.
            [event_type] => mix
            [event_details] => Saw Great and interesting sites today!
        )
    )
    [1] => Array (
        [0] => Array (
            [id] => 1
            [username] => STLUserFolks
            [event_id] => debd6476-4f24-4d2c-9973-7c36d256079d
            [event_on] => 2020-07-09 05:39:10.588842
            [ent_pix] =>
            [\"images/events/STLUserFolks/680.JPG\",\"images/events/STLUserFolks/681.JPG\",\"images/events/STLUserFolks/682.JPG\"]
            [amount] => 25
            [event_title] => Sexy Warm
            [event_type] => photos
            [event_details] => Feeling the sun on our faces.
        )
        [1] => Array (
            [id] => 1
            [user_id] => 2
            [username] => STLUserFolks
            [member_user] => spiffy_user
            [comment_text] => Amazing! you guys are simply amazing!
            [created_on] => 2020-07-10 15:04:46.480001
            [comment_id] => c803294d-8483-43c9-a76b-4cba56795266
            [event_id] => debd6476-4f24-4d2c-9973-7c36d256079d
        )
    )
    [2] => Array (
        [0] => Array (
            [id] => 1
            [username] => STLUserFolks
            [event_id] => 3112f8ff-6119-48c4-810c-594585b5dc63
            [event_on] => 2020-07-09 07:11:32.840511
            [ent_pix] =>
            [\"images/events/STLUserFolks/IMG_2135.JPEG\",\"images/events/STLUserFolks/IMG_2136.JPEG\",\"images/events/STLUserFolks/IMG_2137.JPEG\",\"images/events/STLUserFolks/IMG_2140.JPEG\"]
            [amount] => 25
            [event_title] => New Pants
            [event_type] => photos
            [event_details] => Do these jeans make me look big?
        )
        [1] => Array (
            [id] => 1
            [user_id] => 1
            [username] => STLUserFolks
            [member_user] => Some.Guy
            [comment_text] => Wish I was there!
            [created_on] => 2020-07-10 10:45:42.809338
            [comment_id] => 19115a3e-87ca-410c-aade-c47122068bca
            [event_id] => 3112f8ff-6119-48c4-810c-594585b5dc63
        )
        [2] => Array (
            [id] => 1
            [user_id] => 2
            [username] => STLUserFolks
            [member_user] => spiffy_user
            [comment_text] => Looks like an amazing time.
            [created_on] => 2020-07-10 15:09:05.275935
            [comment_id] => bfd4d4e3-1c88-4f03-936f-cd456dba6096
            [event_id] => 3112f8ff-6119-48c4-810c-594585b5dc63
        )
    )
)

I need to be able to loop through these arrays to apply the comment arrays ([1] and above) to the main arrays [0]. or I need the sequential arrays after [0] to be nested like so:

Array (
    [0] => Array (
        [0] => Array (
            [id] => 1
            [username] => STLUserFolks
            [event_id] => 7e0a2faa-43c8-4552-b0ec-c4d0fa6c00d1
            [event_on] => 2020-06-29 17:39:25.93432
            [ent_pix] =>
            [\"images/events/STLUserFolks/tammy1.jpeg\",\"images/events/STLUserFolks/tammy2.jpeg\",\"images/events/STLUserFolks/tammy3.jpeg\",\"images/events/STLUserFolks/tammy4.jpeg\",\"images/events/STLUserFolks/tammy5.jpeg\",\"images/events/STLUserFolks/tammy6.jpeg\"]
            [amount] => 20
            [event_title] => Fun on vacation with friends.
            [event_type] => mix
            [event_details] => Saw Great and interesting sites today!
        )
    )
    [1] => Array (
        [0] => Array (
            [id] => 1
            [username] => STLUserFolks
            [event_id] => debd6476-4f24-4d2c-9973-7c36d256079d
            [event_on] => 2020-07-09 05:39:10.588842
            [ent_pix] =>
            [\"images/events/STLUserFolks/680.JPG\",\"images/events/STLUserFolks/681.JPG\",\"images/events/STLUserFolks/682.JPG\"]
            [amount] => 25
            [event_title] => Sexy Warm
            [event_type] => photos
            [event_details] => Feeling the sun on our faces.
            [user_comment] => array (
                [id] => 1
                [user_id] => 2
                [username] => STLUserFolks
                [member_user] => spiffy_user
                [comment_text] => Amazing! you guys are simply amazing!
                [created_on] => 2020-07-10 15:04:46.480001
                [comment_id] => c803294d-8483-43c9-a76b-4cba56795266
                [event_id] => debd6476-4f24-4d2c-9973-7c36d256079d
            )
        )
    )
    [2] => Array (
        [0] => Array (
            [id] => 1
            [username] => STLUserFolks
            [event_id] => 3112f8ff-6119-48c4-810c-594585b5dc63
            [event_on] => 2020-07-09 07:11:32.840511
            [ent_pix] =>
            [\"images/events/STLUserFolks/IMG_2135.JPEG\",\"images/events/STLUserFolks/IMG_2136.JPEG\",\"images/events/STLUserFolks/IMG_2137.JPEG\",\"images/events/STLUserFolks/IMG_2140.JPEG\"]
            [amount] => 25
            [event_title] => New Pants
            [event_type] => photos
            [event_details] => Do these jeans make me look big?
            [user_comments] => array (
                array (
                    [id] => 1
                    [user_id] => 1
                    [username] => STLUserFolks
                    [member_user] => Some.Guy
                    [comment_text] => Wish I was there!
                    [created_on] => 2020-07-10 10:45:42.809338
                    [comment_id] => 19115a3e-87ca-410c-aade-c47122068bca
                    [event_id] => 3112f8ff-6119-48c4-810c-594585b5dc63
                )
                array (
                    [id] => 1
                    [user_id] => 2
                    [username] => STLUserFolks
                    [member_user] => spiffy_user
                    [comment_text] => Looks like an amazing time.
                    [created_on] => 2020-07-10 15:09:05.275935
                    [comment_id] => bfd4d4e3-1c88-4f03-936f-cd456dba6096
                    [event_id] => 3112f8ff-6119-48c4-810c-594585b5dc63
                )
            )
        )
    )
)

I've been up half the night on this. Any help would be appreciated. Thanks.

@blahy - What if I wanted to add another nested array like so:

Array (
    [0] => Array (
        [0] => Array (
            [id] => 1
            [username] => STLUserFolks
            [event_id] => 7e0a2faa-43c8-4552-b0ec-c4d0fa6c00d1
            [event_on] => 2020-06-29 17:39:25.93432
            [ent_pix] =>
            [\"images/events/STLUserFolks/tammy1.jpeg\",\"images/events/STLUserFolks/tammy2.jpeg\",\"images/events/STLUserFolks/tammy3.jpeg\",\"images/events/STLUserFolks/tammy4.jpeg\",\"images/events/STLUserFolks/tammy5.jpeg\",\"images/events/STLUserFolks/tammy6.jpeg\"]
            [amount] => 20
            [event_title] => Fun on vacation with friends.
            [event_type] => mix
            [event_details] => Saw Great and interesting sites today!
            [user_comments] => Array (
            )
            [user_likes] => Array (
                [like] => 0
                [not_like] => 1
                [event_id] => 7e0a2faa-43c8-4552-b0ec-c4d0fa6c00d1
                [like_id] => 40
            )
        )
    )
    [1] => Array (
        [0] => Array (
            [id] => 1
            [username] => STLUserFolks
            [event_id] => debd6476-4f24-4d2c-9973-7c36d256079d
            [event_on] => 2020-07-09 05:39:10.588842
            [ent_pix] =>
            [\"images/events/STLUserFolks/680.JPG\",\"images/events/STLUserFolks/681.JPG\",\"images/events/STLUserFolks/682.JPG\"]
            [amount] => 25
            [event_title] => Sexy Warm
            [event_type] => photos
            [event_details] => Feeling the sun on our faces.
            [user_comment] => array (
                [0] => Array (
                    [id] => 1
                    [user_id] => 2
                    [username] => STLUserFolks
                    [member_user] => spiffy_user
                    [comment_text] => Amazing! you guys are simply amazing!
                    [created_on] => 2020-07-10 15:04:46.480001
                    [comment_id] => c803294d-8483-43c9-a76b-4cba56795266
                    [event_id] => debd6476-4f24-4d2c-9973-7c36d256079d
                    )
                )
            [user_likes] => Array (
                [0] => Array (
                    [like] => 5
                    [not_like] => 0
                    [event_id] => 3112f8ff-6119-48c4-810c-594585b5dc63
                    [like_id] => 42
                )
            )
        )
    )
    [2] => Array (
        [0] => Array (
            [id] => 1
            [username] => STLUserFolks
            [event_id] => 3112f8ff-6119-48c4-810c-594585b5dc63
            [event_on] => 2020-07-09 07:11:32.840511
            [ent_pix] =>
            [\"images/events/STLUserFolks/IMG_2135.JPEG\",\"images/events/STLUserFolks/IMG_2136.JPEG\",\"images/events/STLUserFolks/IMG_2137.JPEG\",\"images/events/STLUserFolks/IMG_2140.JPEG\"]
            [amount] => 25
            [event_title] => New Pants
            [event_type] => photos
            [event_details] => Do these jeans make me look big?
            [user_comments] => 
                [0] => Array (
                    array (
                        [id] => 1
                        [user_id] => 1
                        [username] => STLUserFolks
                        [member_user] => Some.Guy
                        [comment_text] => Wish I was there!
                        [created_on] => 2020-07-10 10:45:42.809338
                        [comment_id] => 19115a3e-87ca-410c-aade-c47122068bca
                        [event_id] => 3112f8ff-6119-48c4-810c-594585b5dc63
                    )
                    array (
                        [id] => 1
                        [user_id] => 2
                        [username] => STLUserFolks
                        [member_user] => spiffy_user
                        [comment_text] => Looks like an amazing time.
                        [created_on] => 2020-07-10 15:09:05.275935
                        [comment_id] => bfd4d4e3-1c88-4f03-936f-cd456dba6096
                        [event_id] => 3112f8ff-6119-48c4-810c-594585b5dc63
                    )
                )
            [user_likes] => Array (
                [0] => Array (
                    [like] => 2
                    [not_like] => 0
                    [event_id] => 3112f8ff-6119-48c4-810c-594585b5dc63
                    [like_id] => 42
                )
            )
        )
    )
)

Upvotes: 0

Views: 68

Answers (2)

blahy
blahy

Reputation: 1319

Assuming the input data you provided is in data.php:

<?php

$data = include('data.php');

$result = [];
foreach ($data as $row) {
  $user = $row[0];

  foreach ($row as $k => $element) {
    if ($k === 0) {
      $user = $element;
      $user['user_comments'] = [];   
    } else {
      $user['user_comments'][] = $element;
    }
  }

  $result[] = $user;
}

var_dump($result);

The result is:

array(3) {
  [0]=>
  array(10) {
    ["id"]=>
    int(1)
    ["username"]=>
    string(12) "STLUserFolks"
    ["event_id"]=>
    string(36) "7e0a2faa-43c8-4552-b0ec-c4d0fa6c00d1"
    ["event_on"]=>
    string(25) "2020-06-29 17:39:25.93432"
    ["ent_pix"]=>
    array(6) {
      [0]=>
      string(38) "images/events/STLUserFolks/tammy1.jpeg"
      [1]=>
      string(38) "images/events/STLUserFolks/tammy2.jpeg"
      [2]=>
      string(38) "images/events/STLUserFolks/tammy3.jpeg"
      [3]=>
      string(38) "images/events/STLUserFolks/tammy4.jpeg"
      [4]=>
      string(38) "images/events/STLUserFolks/tammy5.jpeg"
      [5]=>
      string(38) "images/events/STLUserFolks/tammy6.jpeg"
    }
    ["amount"]=>
    int(20)
    ["event_title"]=>
    string(29) "Fun on vacation with friends."
    ["event_type"]=>
    string(3) "mix"
    ["event_details"]=>
    string(38) "Saw Great and interesting sites today!"
    ["user_comments"]=>
    array(0) {
    }
  }
  [1]=>
  array(10) {
    ["id"]=>
    int(1)
    ["username"]=>
    string(12) "STLUserFolks"
    ["event_id"]=>
    string(36) "debd6476-4f24-4d2c-9973-7c36d256079d"
    ["event_on"]=>
    string(26) "2020-07-09 05:39:10.588842"
    ["ent_pix"]=>
    array(3) {
      [0]=>
      string(34) "images/events/STLUserFolks/680.JPG"
      [1]=>
      string(34) "images/events/STLUserFolks/681.JPG"
      [2]=>
      string(34) "images/events/STLUserFolks/682.JPG"
    }
    ["amount"]=>
    int(25)
    ["event_title"]=>
    string(9) "Sexy Warm"
    ["event_type"]=>
    string(6) "photos"
    ["event_details"]=>
    string(29) "Feeling the sun on our faces."
    ["user_comments"]=>
    array(1) {
      [0]=>
      array(8) {
        ["id"]=>
        int(1)
        ["user_id"]=>
        int(2)
        ["username"]=>
        string(12) "STLUserFolks"
        ["member_user"]=>
        string(11) "spiffy_user"
        ["comment_text"]=>
        string(37) "Amazing! you guys are simply amazing!"
        ["created_on"]=>
        string(26) "2020-07-10 15:04:46.480001"
        ["comment_id"]=>
        string(36) "c803294d-8483-43c9-a76b-4cba56795266"
        ["event_id"]=>
        string(36) "debd6476-4f24-4d2c-9973-7c36d256079d"
      }
    }
  }
  [2]=>
  array(10) {
    ["id"]=>
    int(1)
    ["username"]=>
    string(12) "STLUserFolks"
    ["event_id"]=>
    string(36) "3112f8ff-6119-48c4-810c-594585b5dc63"
    ["event_on"]=>
    string(26) "2020-07-09 07:11:32.840511"
    ["ent_pix"]=>
    array(4) {
      [0]=>
      string(40) "images/events/STLUserFolks/IMG_2135.JPEG"
      [1]=>
      string(40) "images/events/STLUserFolks/IMG_2136.JPEG"
      [2]=>
      string(40) "images/events/STLUserFolks/IMG_2137.JPEG"
      [3]=>
      string(40) "images/events/STLUserFolks/IMG_2140.JPEG"
    }
    ["amount"]=>
    int(25)
    ["event_title"]=>
    string(9) "New Pants"
    ["event_type"]=>
    string(6) "photos"
    ["event_details"]=>
    string(32) "Do these jeans make me look big?"
    ["user_comments"]=>
    array(2) {
      [0]=>
      array(8) {
        ["id"]=>
        int(1)
        ["user_id"]=>
        int(1)
        ["username"]=>
        string(12) "STLUserFolks"
        ["member_user"]=>
        string(8) "Some.Guy"
        ["comment_text"]=>
        string(17) "Wish I was there!"
        ["created_on"]=>
        string(26) "2020-07-10 10:45:42.809338"
        ["comment_id"]=>
        string(36) "19115a3e-87ca-410c-aade-c47122068bca"
        ["event_id"]=>
        string(36) "3112f8ff-6119-48c4-810c-594585b5dc63"
      }
      [1]=>
      array(8) {
        ["id"]=>
        int(1)
        ["user_id"]=>
        int(2)
        ["username"]=>
        string(12) "STLUserFolks"
        ["member_user"]=>
        string(11) "spiffy_user"
        ["comment_text"]=>
        string(27) "Looks like an amazing time."
        ["created_on"]=>
        string(26) "2020-07-10 15:09:05.275935"
        ["comment_id"]=>
        string(36) "bfd4d4e3-1c88-4f03-936f-cd456dba6096"
        ["event_id"]=>
        string(36) "3112f8ff-6119-48c4-810c-594585b5dc63"
      }
    }
  }
}

Is that what you want?

The only difference from your expected result is that every row has 'user_comments' array which can be empty, have one or more elements vs this property missing or being called user_comment or user_comments as in your example. I believe this is more consistent and easier to use programatically but it can also be adjusted easily to what you posted if needed.

Edit about comment and like. If you want to fill in both user_comments and user_likes you have to detect if some data is a comment or like. I did it this way: if data contains comment_id it is a comment, if it has like_id it is a like. Then this is a simple edit attached below. The fragment becomes:

foreach ($row as $k => $element) {
    if ($k === 0) {
      $user = $element;
      $user['user_comments'] = [];
      $user['user_likes'] = [];
    } else if (isset($element['comment_id'])) {
      $user['user_comments'][] = $element;
    } else if (isset($element['like_id'])) {
      $user['user_likes'][] = $element;
    }
  }

You can later extend it this way to handle different events if needed.

Upvotes: 1

smwhr
smwhr

Reputation: 683

I used the comment_text key to filter between what's a comment and what's not for a given thread, and group all user_comments under the main. I use an array_map to apply this filter to each thread inside your list.

$flatThreads = \\your initial value

$nestedThreads = array_map(function($thread){
  $notComments = array_filter($thread, function($thread_item){
    return !isset($thread_item["comment_text"]);
  });

  $comments = array_filter($thread, function($thread_item){
    return isset($thread_item["comment_text"]);
  });

  $mainItem = reset($notComments); //get first item that is not a comment
  $mainItem["user_comments"] = $comments;
  return $mainItem;
  
}, $flatThreads);

var_dump($nestedThreads); //what you requested

Upvotes: 0

Related Questions