【问题标题】:How to select element in a php multi dimentional array like the WHERE in mysql如何在 php 多维数组中选择元素,如 mysql 中的 WHERE
【发布时间】:2014-06-30 07:24:47
【问题描述】:

在这样的数组中:

    Array
    (
        [1] => Array
            (
                [name] => boat
                [id] => 2
            )

        [2] => Array
            (
                [name] => house
                [id] => 5
            )
    )

在 php 中, 如何选择“id”等于 5 的元素“名称”? (房子)

(使用 id 5 表示“房子”)

编辑:我可以避免循环吗?耗电少的东西可能吗?

【问题讨论】:

  • 基本循环:foreach ($array as $sub) { if ($sub['id'] == 5) { echo $sub['name']; } }
  • 如果你想通过类似于SQL的语法访问数组,也许你想考虑使用LINQ或类似的;或者,一个非常简单的array_filter()... 但你无法避免循环,只需隐藏循环或循环通过 PHP 的底层 C 代码
  • 您还可以重新格式化您的阵列以便更轻松/更快地访问。在构建数组时将id设置为第一级键(或之后循环并创建一个新数组)。
  • 不做疯狂的事,可能不会。如果您可以显示创建此数组的代码,那么让 SQL 为您完成工作可能会更容易 =)
  • 你不应该在恕我直言的早期担心微观性能。瓶颈通常存在于系统的其他部分。正如@MonkeyZeus 已经提到的,优化查询以仅返回一个结果,从而完全避免循环从长远来看会更好。

标签: php arrays


【解决方案1】:

如果您的数据不太适合您的架构,请考虑切换到 MongoDB 之类的东西。来自their docs:

项目数组文档

学生集合包含以下文档,其中成绩字段是文档数组;每个文档包含三个字段名称grade、mean和std:

{ "_id" : 7, semester: 3, "grades" : [ { grade: 80, mean: 75, std: 8 },
                                       { grade: 85, mean: 90, std: 5 },
                                       { grade: 90, mean: 85, std: 3 } ] }

{ "_id" : 8, semester: 3, "grades" : [ { grade: 92, mean: 88, std: 8 },
                                       { grade: 78, mean: 90, std: 5 },
                                       { grade: 88, mean: 85, std: 3 } ] }

在以下查询中,投影 { "grades.$": 1 } 仅返回均值大于 70 的第一个元素,用于成绩字段:

db.students.find(
   { "grades.mean": { $gt: 70 } },
   { "grades.$": 1 }
)

该操作返回以下文档:

{ "_id" : 7, "grades" : [  {  "grade" : 80,  "mean" : 75,  "std" : 8 } ] }
{ "_id" : 8, "grades" : [  {  "grade" : 92,  "mean" : 88,  "std" : 8 } ] }

用 PHP 编写,这个查询看起来像:

$mongoClient = new MongoClient("mongodb://localhost");
$students = $mongoClient->selectCollection("db", "students");
$query = array("grades.mean" => array('$gt' => 70));
$fields = array("grades.$" => 1);

$result = $students->find($query, $fields);
foreach($result as $grades) {
   print_r($grades);
}

【讨论】:

    【解决方案2】:

    这是另一个有趣的:

    echo array_column($array, 'name', 'id')[5];
    

    【讨论】:

    • 你可以详细说明你的答案,你不觉得吗?在恕我直言上,单行字几乎不能作为正确答案。
    • 详细? 给定已发布的数组和 id 5 以拥有“房子”
    【解决方案3】:

    您必须直接或间接地使用循环(在内置方法中)。出于您的考虑,此循环将使用更少的功率。

    试试这样:

    foreach($your_array as $a){
    
          if(in_array(5,$a)){ //check if 5 in this sub array
             print_r($a);
          }
        }
    

    live demo

    如果你想检查多个 id,那么你可以这样做:

     $ids= array(1,3,5); //make an array of ids you want to filter
    
        foreach($array as $a){
    
          if(in_array($a["id"],$ids)){
             print_r($a);
          }
        }
    

    demo2

    【讨论】:

      【解决方案4】:

      没有循环,你可以这样做:

      $result = array_filter($your_array, function($arg) {
          return $arg['id'] == 5;
      });
      

      这将返回一个仅包含匹配的主数组部分的数组。如果你需要使用一个变量,那么就这样做吧:

      $var = 5;
      $result = array_filter($your_array, function($arg) use $var {
          return $arg['id'] == $var;
      });
      

      【讨论】:

      • array_filter 仍然在 PHP 内部循环。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-03-10
      • 2013-11-08
      • 1970-01-01
      • 1970-01-01
      • 2013-12-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多