【问题标题】:Loop Multidimensional PHP arrays and display all the corresponding array循环多维 PHP 数组并显示所有对应的数组
【发布时间】:2019-04-01 20:41:25
【问题描述】:

我在这个主题上发现了一个几乎类似的问题Loop Multidimensional PHP arrays 我的数组有点不同但几乎相似:

Array  
    (   
        [size] => int (995)
        [data] => Array
            (
                [0] => Array
                    (
                        [service] => 8000
                        [network] => xxx.xxx.xxx
                    )
            
                [1] => Array
                    (
                        [service] => 9000
                        [network] => xxx.xxx.xxx
                    )
                [2] => Array
                    (
                        [service] => 9500
                        [network] => xxx.xxx.xxx
                    )
            )    
    )

我想检查所有service的值,以查看用户输入的数字是否有效并存在,并显示对应的network

这是我天真的尝试:

$record = NULL;

// let's assume $x as this array here
foreach($record in $x['data']){
    if($record['service'] == $bus){
        break;
    }
}

if($record){
    // record found
    var_dump($record);
}else{
    echo "Not found";
}

【问题讨论】:

  • 在使用foreach循环之前,你应该检查文档php.net/manual/en/control-structures.foreach.php
  • 非常感谢尼克。我只是不明白为什么在我发布的链接中,他需要使用 3 个叠层 foreach 循环而我只需要使用一个?
  • 在您发布的问题中,用户想要打印所有项目、子项目和子子项目。在您的情况下,您只需要迭代一个级别 $x['data'] 并打印适合的项目。
  • 你放弃了吗?
  • 当然不是,但我不明白为什么我的帖子投了反对票。我真的很花时间把它写得尽可能清楚

标签: php associative-array


【解决方案1】:

只是为了好玩,假设 service 是唯一的:

$services = array_column($x['data'], null, 'service');

if(isset($services[$bus]) {
    echo $services[$bus]['network'];
} else {
    echo "Not found";
}
  • 提取一个数组并用service索引它
  • 现在您可以通过$services[$bus] 访问它。 $services[8000]['network']

【讨论】:

    【解决方案2】:

    几乎正确:

    forEach 语法正好相反:forEach(<array> as $iterator) 哦,您需要处理对 $reslt 变量的赋值(由于某种原因我将其重命名为 $found )有点不同

     $found=NULL;
        // let's assume $x as this array here
        foreach($x['data'] as $record ){
            if($record['service'] == $bus){
                $found=$record['service'];
            }
        }
    
        if($found != NULL){
            // record found
            var_dump($record);
        }else{
            echo "Not found";
        }
    

    【讨论】:

    • 请在此处添加一些说明,说明您在代码中所做的更改或错误所在。
    • 他将foreach参数中的“in”语句改为“as”,并添加了一个var_dump($record);下面的 if 语句中的行。
    • 好的,但还是请在帖子中添加一些描述,记住你是在为以后的读者回答问题,那些人可能不知道你的代码建议的原因。
    【解决方案3】:

    添加到 Johnathon Heindl:(抱歉我还不能回复)。

    将 $found 设为一个数组可能很有用,以防您发现相同的服务具有不同的网络。

    $found=[];
    // let's assume $x as this array here
    foreach($x['data'] as $record ){
       if($record['service'] == $bus){
           //appends to $found
           $found[]=$record['service'];
       }
    }
    if(!empty($found){
       // record(s) found
       var_dump($record);
    }else{
       echo "Not found";
    }
    
    

    【讨论】:

      【解决方案4】:

      如果我没看错你的问题,应该是这样的:

      // For the sake of the example, first I reconstructed your array:
      $ar1 = array("service" => 8000, "network" => "111.111.111");
      $ar2 = array("service" => 9000, "network" => "222.222.222");
      $ar3 = array("service" => 9500, "network" => "333.333.333");
      $x = array("size" => 995,
              "data" => array($ar1,$ar2,$ar3));
      
      $record = NULL;
      $bus = 9000;
      
      for($n = 0; $n < count($x["data"]); $n++){
          $checkService = $x["data"][$n];
          if($checkService["service"] == $bus){
              $record = $checkService["network"];
          }
      }
      
      if ($record) {
          // If record found:
          echo "Lookup Results for ".$bus.": ".$record;
          // Since we are searching for 9000 in this example, this should output -> Lookup Results for 9000: 222.222.222
      } else {
          echo "Record not found";
      }
      

      此代码可以进一步简化,但我不确定您究竟需要什么。

      您可以通过this example查看最终结果。

      【讨论】:

      • 非常感谢 Markafa,你是唯一一个明白我需要什么的人!非常感谢!
      • 不客气。我很高兴能帮上忙。它是否帮助您解决了您的问题?或者您需要进一步解释/帮助您解决问题吗? @john_johnk
      【解决方案5】:
      $found_record = NULL;
      // let's assume $x as this array here
      foreach($record in $x['data']){
      if($record['service'] == $bus){
           $found_record = $record['service'];
            break;
          }
        }
       if($found_record){
         // record found
         var_dump($record);
        }else{
          echo "Not found";
      }
      

      【讨论】:

      • 欢迎来到 Stack Overflow!虽然此代码 sn-p 可能是解决方案,但including an explanation 确实有助于提高您的帖子质量。请记住,您是在为将来的读者回答问题,而这些人可能不知道您提出代码建议的原因。
      猜你喜欢
      • 2015-03-22
      • 2013-06-25
      • 2019-07-17
      • 2012-05-13
      • 1970-01-01
      • 2018-03-24
      • 1970-01-01
      • 2021-05-06
      • 2012-07-07
      相关资源
      最近更新 更多