将字符串值与 PHP/Laravel 中的字符串数组进行比较?

Posted

技术标签:

【中文标题】将字符串值与 PHP/Laravel 中的字符串数组进行比较?【英文标题】:Compare string value against array of strings in PHP/ Laravel? 【发布时间】:2021-06-28 20:05:32 【问题描述】:

我想用数组匹配字符串。我正在从数据库中的状态表中检索状态代码...我有一个带有代码和名称的 json 文件...根据从 db 返回的状态代码,我需要在 json 文件中匹配此代码并在其中显示状态名称前锋

请大家帮忙

谢谢

状态码数组

[
 
     "code":"0",
     "name":"AB"
   ,
   
     "code":"1",
     "name":"CD"
   ,
   
     "code":"2",
     "name":"XY"
   ,
   
     "code":"10",
     "name":"EF"
   ,
   
     "code":"12",
     "name":"FG"
   
 ]

 <?php $findproducts = \DB::table('status')->select('id', 'status_name', 'ab', 'status_code','created_at')->where('ab', $track->ab)->orderBy('id', 'DESC')->get(); ?>
                                         

字符串位置....

 @foreach($findproducts as $pr) 
  @if($statuscodes != null)
   @foreach ($statuscodes as $stcode) 
     @if (strpos($pr->status_code, $stcode['code']) !== FALSE) 
        $stcode['name']." " .$stcode['code']                                                              
     @endif
   @endforeach
@endif
@endforeach

我从上面得到的输出是 CD 1 XY 2 FG 12 CD 1 AB 0 EF 10 XY 2 光盘 1 AB 0预期输出应为 FG 12 英孚 10 XY 2 光盘 1 AB 0

【问题讨论】:

你可以把orderBy('id', 'DESC')改成orderBy('code', 'DESC')吗? @Johannes 我试过了,但我得到了相同的输出 您的外循环正在循环所有产品,因此如果第一个产品的状态码为1212,它将输出这些。如果我正确地得到了您的预期输出,您想输出 statuscodes 数组元素而不是产品,对吗? @Johannes 是的,完全正确......如果代码是 12,我只想打印状态名称 FG 就是这样......但它循环通过 1 和下一个 2,然后是 12,这是错误的 我很困惑你为什么要这么做strpos($pr-&gt;status_code, $stcode['code'])。你能解释一下你想做什么,因为我无法理解你的例子......你真正想做什么?还有你用的是什么版本的PHP? 【参考方案1】:

试试这个,更干净

首先将状态码转换为集合,然后将其转换为 key=> value 对的集合

这应该是状态码集合

然后使用简单的 foreach 循环查找您的密钥。

请注意,我不确定从数据库返回什么,因此您可以更改代码以适应所需的输出。

也尽量避免嵌套循环

$status_code = collect(json_decode('[
 
     "code":"0",
     "name":"AB"
   ,
   
     "code":"1",
     "name":"CD"
   ,
   
     "code":"2",
     "name":"XY"
   ,
   
     "code":"10",
     "name":"EF"
   ,
   
     "code":"12",
     "name":"FG"
   ]'
 ,true))->pluck('code','name');



@foreach($findproducts as $pr)
$pr->status_code ." ". $status_code[$pr->status_code]
@endforeach

【讨论】:

【参考方案2】:

你为什么这样做:

@if (strpos($pr->status_code, $stcode['code']) !== FALSE)
     $stcode['name']." ".$stcode['code'] 
@endif

代替:

@if ($pr->status_code === $stcode['code'])
     $stcode['name']." ".$stcode['code'] 
@endif

我认为您的问题是strpos(我不确定您为什么要使用它)。正如文档所说:Prior to PHP 8.0.0, if needle is not a string, it is converted to an integer and applied as the ordinal value of a character. This behavior is deprecated as of PHP 7.3.0, and relying on it is highly discouraged. Depending on the intended behavior, the needle should either be explicitly cast to string, or an explicit call to chr() should be performed.

我不确定你的针是否被用作数字,所以它把事情搞砸了......

此外,当if 为真并且您打印您想要的内容时,您可以打破foreach,这样您就不会浪费时间和精力来迭代您知道在某些事情发生变化之前永远不会再次为真的东西。您可以使用@break 来执行此操作。

@if($statuscodes != null)
    @foreach($findproducts as $pr)
        @foreach ($statuscodes as $stcode)
            @if ($pr->status_code === $stcode['code'])
                 $stcode['name']." ".$stcode['code'] 
                @break
            @endif
        @endforeach
    @endforeach
@endif

还看到我已将foreach 与第一个if 切换,因为如果您没有$statuscodes,您为什么要迭代$findproducts 并跳过所有内容?甚至不要迭代它......

【讨论】:

是的,我试过这个终于得到了想要的结果tq

以上是关于将字符串值与 PHP/Laravel 中的字符串数组进行比较?的主要内容,如果未能解决你的问题,请参考以下文章

将对象数组中的值与 React Native/Javascript 中的字符串进行比较

您如何将 element.getAttribute() 的值与量角器中的字符串进行比较?

将一个表中的多个值与另一个表中的多个值进行比较

将递增值与其他值一起添加到 Oracle 数据库中的列中

将数组的值与字符串 PHP 匹配

在 PHP Laravel 中的 SQL Server 中将字符串转换为日期数据类型