Создавать вложенные массивы из последовательных массивов в PHP - PullRequest
0 голосов
/ 11 июля 2020

Мне нужна помощь в сортировке массивов в PHP. Я получаю эти массивы следующим образом:

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

Мне нужно иметь возможность l oop через эти массивы, чтобы применить массивы комментариев ([1] и выше) к основным массивам [0] . или мне нужно, чтобы последовательные массивы после [0] были вложены следующим образом:

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

Я просидел на этом половину ночи. Любая помощь будет оценена. Спасибо.

@ blahy - Что, если бы я хотел добавить еще один вложенный массив, например:

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

Ответы [ 2 ]

1 голос
/ 11 июля 2020

Предполагается, что введенные вами входные данные находятся в 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);

Результат:

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"
      }
    }
  }
}

Это то, что вы хотите?

Единственное отличие от ожидаемого результата заключается в том, что каждая строка имеет массив user_comments, который может быть пустым, иметь один или несколько элементов, а это свойство отсутствует или называется user_comment или user_comments, как в вашем примере. Я считаю, что это более согласованно и проще в использовании программно, но при необходимости его также можно легко настроить в соответствии с тем, что вы разместили.

Редактировать комментарии и т. Д. Если вы хотите заполнить как user_comments, так и user_likes, вы должны определить, являются ли некоторые данные комментарием или подобным. Я сделал это так: если данные содержат comment_id, это комментарий, если like_id - это лайк. Тогда это простое редактирование прилагается ниже. Фрагмент становится:

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;
    }
  }

Позже вы можете расширить его таким образом, чтобы при необходимости обрабатывать различные события.

0 голосов
/ 11 июля 2020

Я использовал клавишу comment_text для фильтрации между тем, что является комментарием, а что нет для данного потока, и сгруппировал все user_comments в основном. Я использую array_map, чтобы применить этот фильтр к каждому потоку в вашем списке.

$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
...