【问题标题】:check data if is equal from 2 foreach php检查数据是否等于 2 foreach php
【发布时间】:2020-08-06 07:34:47
【问题描述】:

我想像这样检查我的数据

来自 foreach 的数据源结果

Data Source => 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17

我的 foreach 结果数据是:

ID_1 => 4, 5, 6, 10, 11, 13, 15
ID_2 => 1, 2, 3, 4, 5, 6, 7, 8

如何检查id是否与数据源相同或相等,结果为真,如果id没有数据源,结果为假?

这是我的代码来获取数据

        @php
            $items = array();
            foreach($activity as $a){
                $items[] = $a->id;
            }
            $list = implode(', ', $items); 
        @endphp
        Data Source => {{ $list }}


        @foreach($result as $detail_activity)
            ID_{{$detail_activity->id}}  => {{$detail_activity->ActivityDetail}}<br>
        @endforeach

结果是这样的

如果我们使用该示例数据,可能会像

data source | id_1 | id_2 |
1             False True
2             False True
3             False True
4             True  True

感谢您的提前:D

【问题讨论】:

  • 你能举个例子吗?
  • 我已经编辑了帖子:D
  • 数据源和那两个数组总是排序的吗?
  • 是的,已经排序了
  • 任何更新......?

标签: php arrays laravel


【解决方案1】:

假设$dataSource是一个数组,例如

$dataSource = [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17 ];

假设$id_1$id_2 是数组,例如:

$id_1 = [ 4, 5, 6, 10, 11, 13, 15 ];
$id_2 = [ 1, 2, 3, 4, 5, 6, 7, 8 ];

判断$dataSources中的每个元素是否存在于$id_1$id_2中:

foreach ( $dataSource as $id ) {
    echo $id,
    ( in_array( $id, $id_1 ) ? 'True' : 'False' ),
    ( in_array( $id, $id_2 ) ? 'True' : 'False' ),
    "\n";
}

更好的方法是将信息存储在$id_1$id_2 中,然后使用表达式$id_1[$id],因为这比in_array() 更快。

【讨论】:

  • 但我的意思是比较一个数组,如果 id_1 或 id_2 不在数据源中,则结果必须为 false,btw id _1 和 id_2 是 foreach 的结果。它必须嵌套 foreach?
【解决方案2】:

我们首先创建一个helper,它使用binary search(用于快速搜索)告诉我们一个值是否存在于sorted 数组中。

Helpers.php:(将此文件添加到bootstrap文件夹中)

<?php

function has($needle,$haystack){
    if(!isSorted($haystack)){
        throw new Exception("Sorted array expected but unsorted array given.");
        return;
    }

    $low = 0;
    $high = count($haystack) - 1;
    while($low <= $high){
        $mid = $low + intval(($high - $low) / 2);
        if($haystack[$mid] === $needle) return true;
        if($haystack[$mid] > $needle) $high = $mid - 1;
        else $low = $mid + 1;
    }

    return false;
}

function isSorted($haystack){
    $keys = array_keys($haystack);
    foreach($keys as $index => $key){
        if($index - 1 >= 0 && $haystack[$key] < $haystack[$keys[$index-1]]){
            return false;
        }
    }
    return true;
}

要使这些功能在您的项目中可用,您需要在autoload 部分中编辑composer.json,如下所示:

 "autoload": {
        "psr-4": {
            "App\\": "app/"
        },
        "classmap": [
            "database/seeds",
            "database/factories"
        ],
        "files": [
           "bootstrap/helpers.php" // <--- this line
        ]
    },

现在,执行 composer dump-autoload 来自动加载此文件。

刀片代码将非常简单,如下所示:

@foreach($data_source as $val)
    @if(has($val,$ID_1))
        <p>{{ $val }} => ID_1 true</p>
    @else
        <p>{{ $val }} => ID_1 false</p>
    @endif
    @if(has($val,$ID_2))
        <p>{{ $val }} => ID_2 true</p>
    @else
        <p>{{ $val }} => ID_2 false</p>
    @endif
@endforeach

【讨论】:

    【解决方案3】:

    感谢大家的每一个回复...抱歉,如果我的回复太长了

    首先我们创建一个函数

    function checkfacility($facility,$datasource){
                            foreach($datasource as $ds){
                                if($facility == $ds->name){
                                    return true;
                                }   
                            }
                        }
    

    然后我们在刀片模板这样的条件下创建了一个 foreach

    @foreach ($facility as $key => $values)
       <td>{{ (checkfacility($values->name,$datasource)) == TRUE ? 'true' : 'false' }}</td>
    @endforeach
    
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-12-05
      • 1970-01-01
      • 1970-01-01
      • 2018-09-25
      • 2010-11-16
      • 1970-01-01
      • 2021-06-20
      • 1970-01-01
      相关资源
      最近更新 更多