如何从数组中的对象中获取值

时间:2013-04-06 04:16:11

标签: php object multidimensional-array

我正在尝试从名为$ items

的变量中获取数据

当我var_dump($ items); - 结果是这样的:

array(13) { 

[0]=> object(stdClass)#868 (2) { 
        ["meta_key"]=> string(17) "Email of Attendee"        
        ["meta_value"]=> string(68) "some-email@gmail.com" 
} 

[2]=> object(stdClass)#804 (2) { 
        ["meta_key"]=> string(28) "Name to be printed on badge:" 
        ["meta_value"]=> string(7) "some name to be printed" 
}

......等等11次

我想知道是否可以从$ items获取包含以下代码的电子邮件:

$email = $items找到meta_key具有值"Email of Attendee"的对象,然后返回相应的值。

我最终做的是通过foreach循环运行$items,如下所示:

foreach($items as $item){

    $items[$item->meta_key]=$item->meta_value;

}

将所有“meta_keys”转换为它们引用的值。现在:

$email = $items["Email of Attendee"]  

echo $email; 

result is some-email@gmail.com

这样发布 一个。类似果酱中的其他人可能会使用每个转换事物的循环

湾有经验的人可以建议一种方法来直接从$ items中获取“参与者的电子邮件”,而无需通过foreach循环运行它。

4 个答案:

答案 0 :(得分:0)

仍然依赖于使用foreach循环。

function get_email($items) {

    foreach($items as $item){

        if (in_array("Email of Attendee", $item) {
            $email = $item["meta_value"];
            break;
        }

    }
    return $email;
}

校正 您可以使用array_filter

获取特定对象
$result = array_filter($array, function($o) {
                   return $o->meta_key == "Email of Attendee";
});

$email = $result[0]->meta_value;

echo $email;

答案 1 :(得分:0)

这应该是神奇的。

foreach($items as $item){

    // $item is already holding the object here. Equals to $items[0] in the first loop
    if($item->meta_key == "Email of Attendee"){
        // do stuff
    }

}

答案 2 :(得分:0)

引自Search Array : array_filter vs loop

  

array_filter()无法原生处理[多维数组]。你在数组中寻找一个值? array_filter()不是最好的方法,因为你可以在找到你一直在寻找的值时停止迭代 - array_filter()不这样做。从较大的集合中过滤一组值?最有可能array_filter()比手动编码的foreach循环更快,因为它是内置函数。 - Stefan Gehrig

使用php foreach loop可能更容易阅读:

function getItem($haystack, $needle) {
  foreach ($haystack as $hay) {
    if ($hay->meta_key == $needle) {
      return $hay->meta_value;
    }
  }
  return FALSE;
}

echo getItem($items, 'Email of Attendee'); // Returns 'some-email@gmail.com'

然而,正如引用所说,对于更大的数组,你可能想要使用像php array_filter()这样的东西:

function metaKeyIsEmail($obj) {
  return $obj->meta_key == 'Email of Attendee';
}

// array_filter() will return an array containing all items
// that returned TRUE for the callback metaKeyIsEmail()
$items_matched = array_filter($items, 'metaKeyIsEmail');

// If there was at least one match, take it off the front of
// the array and get its meta_value. Otherwise use FALSE.
$matched_value = !empty($items_matched) ? array_shift($items_matched)->meta_value : FALSE;

echo $matched_value; // Returns 'some-email@gmail.com'

答案 3 :(得分:0)

foreach可以遍历数组以及object

$given_array = array((object)array('meta_key'=>'email','mea_value'=>'fg'),
                     (object)array('meta_key'=>'email','mea_value'=>'gfdgf'));


foreach($given_array as $elt){
    foreach($elt as $key=>$value){
                if($key == "Email of Attendee"){
                    echo $email;
        }
}