简体   繁体   English

从 PHP 中的顺序 arrays 创建嵌套 arrays

[英]Create Nested arrays from sequential arrays in PHP

I need help sorting arrays in PHP.我需要帮助在 PHP 中排序 arrays。 I'm receiving these arrays like so:我收到这些 arrays 像这样:

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].我需要能够遍历这些 arrays 以将评论 arrays([1] 及以上)应用到主 arrays [0]。 or I need the sequential arrays after [0] to be nested like so:或者我需要像这样嵌套 [0] 之后的顺序 arrays :

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

Assuming the input data you provided is in data.php:假设您提供的输入数据在 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.与您的预期结果的唯一区别是每一行都有“user_comments”数组,该数组可以为空,有一个或多个元素,而此属性缺失或被称为user_commentuser_comments ,如您的示例所示。 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.如果要同时填写 user_comments 和 user_likes,则必须检测某些数据是否是评论或喜欢。 I did it this way: if data contains comment_id it is a comment, if it has like_id it is a like.我是这样做的:如果数据包含comment_id,它就是一个评论,如果它有like_id,它就是一个赞。 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.如果需要,您可以稍后以这种方式扩展它以处理不同的事件。

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.我使用comment_text键在给定线程的评论和非评论之间进行过滤,并将所有user_comments分组在主目录下。 I use an array_map to apply this filter to each thread inside your list.我使用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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM