2013-04-06 3 views
0

Я пытаюсь получить данные из переменных $ пунктовКак получить значение внутри объекта, который находится в пределах массива

Когда я var_dump (пункты $); - результат таков:

array(13) { 

[0]=> object(stdClass)#868 (2) { 
     ["meta_key"]=> string(17) "Email of Attendee"   
     ["meta_value"]=> string(68) "[email protected]" 
} 

[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 раз больше

Я хочу знать, если это возможно, чтобы получить письмо от $ пунктов с кодом что-то вроде этого:

$email = $items найти объект, где meta_key имеет значение "Email of Attendee", тогда верните мне соответствующее значение.

То, что я в конечном итоге делаю бегали $items через петлю Еогеаспа так:

foreach($items as $item){ 

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

} 

, который преобразует все «meta_keys» в те ценности, которые они ссылающиеся. Сейчас:

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

echo $email; 

result is [email protected] 

Проводка это так, что а. кто-то другой в подобном варенье может использовать для каждого цикла, который преобразует вещи

b. кто-то с большим опытом может предложить способ получить «Email от Attendee непосредственно от $ пунктов, без необходимости запускать ее через петлю Еогеаспа.

+0

Я не думаю, что для этого есть что-то встроенное. Но если вы просто хотите найти одну запись, вам не нужно строить этот другой массив, просто напишите цикл, который его ищет и разрывается, когда он его найдет. – Barmar

+0

Итак, вы «хотите знать, если это возможно» ... но вы опубликовали, как вы это делаете. Где/то, что именно вы ищете? http://stackoverflow.com/faq#dontask – Abela

ответ

0

Тем не менее, опираясь на использовании цикла Еогеаспа.

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; 
+0

@Aiias Мой плохой, видел «многомерный массив», а мысль «$ item» - это массив. – viclim

+0

@Aiias Обновлен мой ответ, Mind тестирует его? – viclim

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 
    } 

} 
0

Цитируется Search Array : array_filter vs loop:

array_filter() не может справиться [многомерные массивы] изначально. Вы ищете одно значение внутри массива? array_filter() - не лучший способ сделать это, потому что вы можете остановить итерацию, когда найдете нужное значение - array_filter() этого не делает. Фильтровать набор значений из большего набора? Скорее всего, что array_filter() быстрее, чем ручной код foreach -loop, потому что это встроенная функция.- 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 '[email protected]' 

Однако, как цитата предполагает, для большего массива, вы можете пойти с чем-то вроде РНР 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 '[email protected]' 
0

Еогеасп может перебирать массив, а также 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; 
     } 
} 
Смежные вопросы