【问题标题】:Multidimensional array to flat array php多维数组到平面数组php
【发布时间】:2014-05-10 16:35:31
【问题描述】:

我一直在搜索,但在 PHP 中找不到我的问题的有效解决方案。

我有一个带有 cmets 的数组,用户可以在上面提供 cmets。您可以看到每条评论都有一个名为“级别”的值。我想要一个包含 8 个对象的平面数组,其顺序与它们现在显示的顺序相同。所以这将是“comment_id”-> 1,2,3,8,4,5,6,7。

编辑: 所以这就是我用来构建数组的:

function loopThroughComments($rows = null, $row = null, $flat = false, $level){
    $limit = count($rows);
    for($i = 0; $i < $limit; $i++){
        $rows[$i]['comments'] = loopThroughComments($rows[$i]['comments'], $row, $flat, $level++);
        if($rows[$i]['comment_id'] == $row['comment_on_id']){
            if($flat){
                $row['level'] = $level;
            }
            array_push($rows[$i]['comments'], $row);
            break;
        }
    }
    return $rows;
}

现在,当 $flat == true 时,我想让数组变平,但无论我尝试什么,格式都会搞砸

所以我得到了这个数组:

 Array
    (
        [0] => Array
            (
                [comment_id] => 1
                [user_id] => 3
                [article_id] => 1345da9bae3e3bb436626422006abe04748432b9
                [comment_on_id] => 0
                [comment_text] => Dit is een eerste comment
                [comment_likes] => 6
                [comments] => Array
                    (
                        [0] => Array
                            (
                                [comment_id] => 2
                                [user_id] => 4
                                [article_id] => 1345da9bae3e3bb436626422006abe04748432b9
                                [comment_on_id] => 1
                                [comment_text] => Dit is een reactie op dit ding hiero
                                [comment_likes] => 1
                                [comments] => Array
                                    (
                                        [0] => Array
                                            (
                                                [comment_id] => 3
                                                [user_id] => 3
                                                [article_id] => 1345da9bae3e3bb436626422006abe04748432b9
                                                [comment_on_id] => 2
                                                [comment_text] => test 123
                                                [comment_likes] => 7
                                                [comments] => Array
                                                    (
                                                        [0] => Array
                                                            (
                                                                [comment_id] => 8
                                                                [user_id] => 4
                                                                [article_id] => 1345da9bae3e3bb436626422006abe04748432b9
                                                                [comment_on_id] => 3
                                                                [comment_text] => level 2 comment
                                                                [comment_likes] => 7
                                                                [comments] => Array
                                                                    (
                                                                    )

                                                                [level] => 3
                                                            )

                                                    )

                                                [level] => 2
                                            )

                                        [1] => Array
                                            (
                                                [comment_id] => 4
                                                [user_id] => 3
                                                [article_id] => 1345da9bae3e3bb436626422006abe04748432b9
                                                [comment_on_id] => 2
                                                [comment_text] => test 9999
                                                [comment_likes] => 0
                                                [comments] => Array
                                                    (
                                                    )

                                                [level] => 2
                                            )

                                        [2] => Array
                                            (
                                                [comment_id] => 5
                                                [user_id] => 3
                                                [article_id] => 1345da9bae3e3bb436626422006abe04748432b9
                                                [comment_on_id] => 2
                                                [comment_text] => test 0000
                                                [comment_likes] => 0
                                                [comments] => Array
                                                    (
                                                    )

                                                [level] => 2
                                            )

                                    )

                                [level] => 1
                            )

                        [1] => Array
                            (
                                [comment_id] => 6
                                [user_id] => 3
                                [article_id] => 1345da9bae3e3bb436626422006abe04748432b9
                                [comment_on_id] => 1
                                [comment_text] => test 555
                                [comment_likes] => 1
                                [comments] => Array
                                    (
                                    )

                                [level] => 1
                            )

                    )

                [level] => 0
            )

        [1] => Array
            (
                [comment_id] => 7
                [user_id] => 3
                [article_id] => 1345da9bae3e3bb436626422006abe04748432b9
                [comment_on_id] => 0
                [comment_text] => dit is een tweede comment
                [comment_likes] => 1
                [comments] => Array
                    (
                    )

                [level] => 0
            )

    )

【问题讨论】:

  • 从你写问题的方式来看,有些人可能会错误地认为你希望我们为你编写代码,这是题外话。我猜你只是想在你自己的代码上得到帮助,所以你能告诉我们你到目前为止写了什么吗?

标签: php arrays multidimensional-array


【解决方案1】:

这段代码应该可以工作:

<?php

$result = array();

$arr = $arr[0];

while (is_array($arr['comments']) {
  $el = $arr;
  unset($el['comments']);
  $result[] = $el; 
  if (isset($arr['comments'])) {
    $arr = $arr['comments'];
  }
  else {
    break;
 }
}

您没有在 PHP 中提供数据,所以我无法对其进行测试。 但是这段代码肯定不是最优的。

如果您确定数组中的字段,我强烈建议您更改行:

  $el = $arr;
  unset($el['comments']);
  $result[] = $el; 

进入

  $el['comment_id'] = $arr['comment_id'];
  $el['user_id'] = $arr['user_id'];
  // and so on until
  $el['comment_likes'] = $arr['comment_likes'];

另一种解决方案是创建额外的循环,但这个解决方案在你的情况下应该足够了。

【讨论】:

  • 感谢您的回答。这并不完全是我需要的,但我将其更改为: global $flatArray; foreach ($rows as $key => $value) { $arr = $value;未设置($arr['cmets']); array_push($flatArray, $arr); if(isset($value['cmets'])){ flattenArray($value['cmets']); } }
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多