【问题标题】:PHP: search for a value in an array which contains objectsPHP:在包含对象的数组中搜索一个值
【发布时间】:2012-07-23 19:20:27
【问题描述】:

我正在寻找的是一种从这些中搜索任何内容并取回所有字段的快速方法,例如,如果我在示例代码(如下所示)中搜索 favcolors 中的“red”,我会得到该人的姓名这是谁孩子最喜欢的颜色,即在这种情况下,返回一个包含 jhon 和 homer 的数组。如果搜索词是年龄 = 43 的人,则返回 homer,依此类推...:

<?php
class person {
public $name;
public $kidsfavcolors=array();
public $age;
}

$people['jhon'] = new person;
$people['jhon']->name = "jhon";
$people['jhon']->age = 30;
$people['jhon']->kidsfavcolors['katherine']= "red";
$people['jhon']->kidsfavcolors['jimmy']= "yellow";

$people['homer'] = new person;
$people['homer']->name = "homer";
$people['homer']->age = 43;
$people['homer']->kidsfavcolors['bart']= "black";
$people['homer']->kidsfavcolors['lisa']= "red";

【问题讨论】:

  • 所以基本上你想递归搜索所有字段?
  • 不确定是否有任何内置用于此类自定义任务。您将不得不以旧方式进行,即实现递归搜索。
  • 使用数据库并编写查询:P
  • 我建议您编写一些示例函数调用,您希望搜索如何工作。
  • 什么是递归搜索?基本上我希望它像 mySQL 中的 SELECT 关键字一样起作用,但不幸的是,这些数据不能写入数据库

标签: php arrays search object


【解决方案1】:

这可能是一个起点:

function search_objects($objects, $key, $value) { // might contain bugs as I typed in in SO on the go
    $return = array();
    foreach ($objects as $object) {
        $objVars = get_object_vars($object);
        if (isset($objVars[$key]) && $objVars[$key] == $value) {
           $return[] = $object;
        }
    }
    return $return;
}

print_r(search_object($people, 'name', 'john'));

如果没有某种索引,它不会比对象的线性行走快得多。此搜索的复杂度为 n*(可变属性计数)。您将不得不修改它以搜索不是简单的 key=>value 而是数组的属性。您可能想要使用反射。

数据从何而来?我相当乐观,如果我们知道更多,会有更好的方法来做到这一点。

【讨论】:

  • 如果索引(数组的键)未知怎么办?
  • 索引不是未知的,它只是在您的情况下不存在(您可以创建它)。有一些方法可以通过稍后搜索对象的字段来索引对象,这将减少内存消耗的时间。但是你有多少个对象?如果它是一个少于 5 个零的数字,那么您可能不需要比我提供的解决方案更复杂的任何东西。在不必要的情况下,不要进行过早的优化,这会花费您的时间、精力和复杂性。你还没有说你为什么想要那个,你将如何使用它以及数据来自哪里......
  • 大约有 55,000 个对象,您的功能不会花费很多时间,但有一件事:它不起作用!我用 var_dump 替换了你函数中的 print_r 并修复了最后一行的错字,但这是我得到的输出:- array empty
  • 对不起,你的函数工作得很好,这是我对 jhon 的错误拼写:P
猜你喜欢
  • 1970-01-01
  • 2020-01-17
  • 1970-01-01
  • 2014-09-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-26
相关资源
最近更新 更多