PHP - 从对象数组中按对象属性查找条目

时间:2011-01-20 02:24:39

标签: php arrays object

数组看起来像:

[0] => stdClass Object
        (
            [ID] => 420
            [name] => Mary
         )

[1] => stdClass Object
        (
            [ID] => 10957
            [name] => Blah
         )
...

我有一个名为$v的整数变量。

如何选择具有ID属性具有$v值的对象的数组条目?

13 个答案:

答案 0 :(得分:156)

您可以迭代数组,搜索特定记录(只需一次搜索即可)或使用其他关联数组构建哈希映射。

对于前者,这样的事情

$item = null;
foreach($array as $struct) {
    if ($v == $struct->ID) {
        $item = $struct;
        break;
    }
}

有关后者的更多信息,请参阅此问题和后续答案 - Reference PHP array by multiple indexes

答案 1 :(得分:57)

YurkamTim是对的。它只需要修改:

在函数($)之后,您需要通过“use(& $ searchingValue)”指向外部变量的指针,然后您可以访问外部变量。你也可以修改它。

$neededObject = array_filter(
    $arrayOfObjects,
    function ($e) use (&$searchedValue) {
        return $e->id == $searchedValue;
    }
);

答案 2 :(得分:23)

我找到了更优雅的解决方案here。适应问题看起来像:

$neededObject = array_filter(
    $arrayOfObjects,
    function ($e) {
        return $e->id == $searchedValue;
    }
);

答案 3 :(得分:20)

$arr = [
  [
    'ID' => 1
  ]
];

echo array_search(1, array_column($arr, 'ID')); // prints 0 (!== false)

答案 4 :(得分:8)

class ArrayUtils
{
    public static function objArraySearch($array, $index, $value)
    {
        foreach($array as $arrayInf) {
            if($arrayInf->{$index} == $value) {
                return $arrayInf;
            }
        }
        return null;
    }
}

使用您想要的方式将是:

ArrayUtils::objArraySearch($array,'ID',$v);

答案 5 :(得分:8)

如果您需要多次查找,使用array_column重新编制索引可以节省时间:

$lookup = array_column($arr, NULL, 'id');   // re-index by 'id'

然后您可以随意$lookup[$id]

答案 6 :(得分:5)

修正了@YurkaTim的一个小错误,您的解决方案对我有用,但添加了use

要在函数内使用$searchedValue,在函数参数use ($searchedValue)之后,一个解决方案可以是function ($e) HERE

如果返回的条件为array_filter,则$neededObject函数仅返回true

如果$searchedValue是字符串或整数:

$searchedValue = 123456; // Value to search.
$neededObject = array_filter(
    $arrayOfObjects,
    function ($e) use ($searchedValue) {
        return $e->id == $searchedValue;
    }
);
var_dump($neededObject); // To see the output

如果$searchedValue是我们需要检查列表的数组:

$searchedValue = array( 1, 5 ); // Value to search.
$neededObject  = array_filter(
    $arrayOfObjects,
    function ( $e ) use ( $searchedValue ) {
        return in_array( $e->term_id, $searchedValue );
    }
);
var_dump($neededObject); // To see the output

答案 7 :(得分:2)

我有时喜欢使用array_reduce()函数来执行搜索。它与array_filter()类似,但不影响搜索到的数组,允许您在同一对象数组上执行多个搜索。

$haystack = array($obj1, $obj2, ...); //some array of objects
$needle = 'looking for me?'; //the value of the object's property we want to find

//carry out the search
$search_results_array = array_reduce(
  $haystack,

  function($result_array, $current_item) use ($needle){
      //Found the an object that meets criteria? Add it to the the result array 
      if ($current_item->someProperty == $needle){
          $result_array[] = $current_item;
      }
      return $result_array;
  },
  array() //initially the array is empty (i.e.: item not found)
);

//report whether objects found
if (count($search_results_array) > 0){
  echo "found object(s): ";
  print_r($search_results_array[0]); //sample object found
} else {
  echo "did not find object(s): ";
}

答案 8 :(得分:1)

我用某种Java键映射做到了这一点。 如果这样做,则不需要每次都遍历对象数组。

<?php

//This is your array with objects
$object1 = (object) array('id'=>123,'name'=>'Henk','age'=>65);
$object2 = (object) array('id'=>273,'name'=>'Koos','age'=>25);
$object3 = (object) array('id'=>685,'name'=>'Bram','age'=>75);
$firstArray = Array($object1,$object2);
var_dump($firstArray);

//create a new array
$secondArray = Array();
//loop over all objects
foreach($firstArray as $value){
    //fill second        key          value
    $secondArray[$value->id] = $value->name;
}

var_dump($secondArray);

echo $secondArray['123'];

输出:

array (size=2)
  0 => 
    object(stdClass)[1]
      public 'id' => int 123
      public 'name' => string 'Henk' (length=4)
      public 'age' => int 65
  1 => 
    object(stdClass)[2]
      public 'id' => int 273
      public 'name' => string 'Koos' (length=4)
      public 'age' => int 25
array (size=2)
  123 => string 'Henk' (length=4)
  273 => string 'Koos' (length=4)
Henk

答案 9 :(得分:1)

尝试

found

工作示例here

答案 10 :(得分:0)

我在这里发布了我使用快速二进制搜索算法有效解决此问题的方法:https://stackoverflow.com/a/52786742/1678210

我不想复制相同的答案。有人提出的要求略有不同,但答案是相同的。

答案 11 :(得分:0)

立即获得第一个价值的方法:

$neededObject = array_reduce(
    $arrayOfObjects,
    function ($result, $item) use ($searchedValue) {
        return $item->id == $searchedValue ? $item : $result;
    }
);

答案 12 :(得分:0)

我通过用ID键入数组解决了这个问题。在这种情况下,ID就是您想要的,它更简单,甚至可能更快。

[420] => stdClass Object
        (
            [name] => Mary
         )

[10957] => stdClass Object
        (
            [name] => Blah
         )
...

现在我可以直接对数组进行寻址:

$array[$v]->name = ...

或者,如果我想验证ID的存在:

if (array_key_exists($v, $array)) { ...