从两个json结构对数据表进行排序

时间:2018-06-21 09:54:07

标签: php laravel laravel-5

我要实现什么目标?

我正在尝试根据字段名对数据进行排序,将其放在表的正确位置以便于读取,并在需要时导出。

到目前为止,我在布局上遇到麻烦,请确保所有内容都正确布置。

我有四个表:事件,卡片,card_events(多态)和潜在客户。

卡片属于事件,卡片包含JSON形式的字段,如下所示:

[
  {
    "name": "Title",
    "type": "dropdown",
    "options": [
      "Mr",
      "Miss",
      "Mrs",
      "Ms",
      "Dr"
    ]
  },
  {
    "name": "First Name",
    "type": "text"
  },
  {
    "name": "Last Name",
    "type": "text"
  },
  {
    "name": "Email",
    "type": "text"
  },
  {
    "name": "Phone Number",
    "type": "numeric"
  },
  {
    "name": "Opt in?",
    "type": "bool"
  }
]

由于这些字段可以是用户根据他们希望用户填写的数据定义的任何内容,因此在尝试使所有数据正确同步时,使工作变得更加困难。这是我目前所拥有的:

Data Table:

如您所见,数据遍布整个地方。更加困难的是,可以在任何给定时间更改卡的顺序。

我尝试了什么?

当前,它的工作方式是,如果卡的排列顺序与您填写时的顺序相同,则效果很好,但是如果用户未填写特定的卡,则可以将其禁用,这就是问题所在开始。

因此,这是我的代码,用于显示我试图与表格标题名称匹配的销售线索:

@foreach($leads as $lead)
    <?php
    $fields = json_decode($lead->data);
    ?>
    <tr>
        @foreach($fields as $f)

            @foreach($cards as $card)
                <?php $fields = json_decode($card->fields); ?>
                @foreach($fields as $field)
                    @if($field->name == $f->name)
                        @if($field->type == 'bool')
                            <td>{{$f->value === true ? 'Yes' : 'No'}}</td>
                        @else
                            <td>{{$f->value}}</td>
                        @endif
                    @endif
                @endforeach
            @endforeach

        @endforeach
    </tr>
@endforeach

这是我如何生成表标题:

@foreach($cards as $card)
    <?php $fields = json_decode($card->fields); ?>
    @foreach($fields as $field)
        <th>{{$field->name}}</th>
    @endforeach
@endforeach

由于这取决于用户填写的内容,因此以下是某些值的数据结构:

[
  {
    "name": "Title",
    "value": "Mrs"
  },
  {
    "name": "First Name",
    "value": "Sally"
  },
  {
    "name": "Last Name",
    "value": "Jones"
  },
  {
    "name": "Email",
    "value": "test@exmaple.com"
  },
  {
    "name": "Phone Number",
    "value": "0123456789"
  },
  {
    "name": "Opt in?",
    "value": true
  },
  {
    "name": "Flat\/House Number",
    "value": "123"
  },
  {
    "name": "Street",
    "value": "Generic Street"
  },
  {
    "name": "Post Code",
    "value": "TE57 1NG"
  }
]

我可以单独显示每条引线,这会使生活更轻松,但是将来在导出数据时我仍然会遇到这个问题。

我认为应该执行的操作与我已经执行的操作类似,请尝试将标题与字段名称匹配。

如果有人可以帮助整理数据,我将不胜感激!

很高兴我在网站的其他地方使用Vue时,可以在基于Vue的JS中回答此问题。

1 个答案:

答案 0 :(得分:0)

在浪费了整个上午和整个下午的时间后,我返回了解决方案!

如果您想改善这篇文章的答案,那不是最漂亮的,绝对不是最好的。

基本上只是$ needle / $ haystack路线,这是代码!

leads.blade.php

<table class="table is-striped is-fullwidth">
                <thead>
                <tr>
                    @foreach($headings as $head)
                        <th>{{$head}}</th>
                    @endforeach
                </tr>
                </thead>
                <tbody>
                @foreach($leads as $lead)
                    <tr>
                        @foreach($headings as $key => $head)
                            <?php  $placed = false; ?>
                            @foreach($lead as $val)
                                @if($val->name === $head)
                                    <td>
                                        {{ $val->value ? $val->value : 'N/A' }}
                                    </td>

                                    <?php
                                    $placed = true;
                                    break;
                                    ?>
                                @endif
                            @endforeach
                            @if($placed === false)
                                <td></td>
                                <?php  continue; ?>

                            @endif
                        @endforeach
                    </tr>
                @endforeach
                </tbody>
            </table>

控制器

$headings = [];
    foreach($cards as $card) {
        $fields = json_decode($card->fields);
        foreach($fields as $field) {
            array_push($headings, $field->name);
        }
    }

    $leads = [];
    foreach($event->leads as $lead) {
        $data = json_decode($lead->data);
        array_push($leads, $data);
    }