2011-05-15 8 views
2

Я немного смущен массивом, с которым мне нужно работать. Следующий массив:Получение значения из массива в PHP

print_r($myArray); 

возвращает следующее:

Array (
    [0] => stdClass Object (
     [id] => 88 
     [label] => Bus 
    ) 
    [1] => stdClass Object (
     [id] => 89 
     [label] => Bike 
    ) 
    [2] => stdClass Object (
     [id] => 90 
     [label] => Plane 
    ) 
    [3] => stdClass Object (
     [id] => 91 
     [label] => Submaine 
    ) 
    [4] => stdClass Object (
     [id] => 92 
     [label] => Boat 
    ) 
    [5] => stdClass Object (
     [id] => 93 
     [label] => Car 
    ) 
    [6] => stdClass Object (
     [id] => 94 
     [label] => Truck 
    ) 
) 

Как получить значение метки, скажем, "Submaine", если у меня есть $ ID = 91?

+0

Если вы можете изменить способ построения массива, вы должны индексировать элементы с помощью «id», что будет проще. Тогда вы можете просто сделать '$ item = $ myArray [$ id];' –

+0

Класс создает этот массив, поэтому, к сожалению, мне приходится работать с тем, что у меня есть. Но вы правы, мне жаль, что я не могу просто позвонить по ID. – santa

ответ

7

Это поможет вам объект (ы) Вы ищете:

$objects = array_filter($myArray, function($item){ return $item->id == 91 })

Тогда это просто вопрос получения атрибута объекта, который вы хотите.

+2

Это объекты, поэтому это будет 'return $ item-> id == 91' –

+0

Хороший улов, исправленный. Благодаря! –

+0

+1 Для предложения array_filter, а не для очевидного цикла цикла. – anubhava

3

Похоже, вам придется пройти через массив.

$value = ''; 
foreach ($myArray as $el) { 
    if ($el->id === 91) { // or other number 
     $value = $el->label; 
     break; 
    } 
} 

Метка теперь содержится в $value.


значения Benchmark против версии AJ для 1000000 итераций (see source):

lonesomeday: 1.8717081546783s 
AJ: 4.0924150943756s 
James C: 2.9421799182892s 
+0

+1 для публикации теста, это очень интересно! Что вы использовали для бенчмаркинга? –

+0

@Matthieu Быстрый сценарий, который я написал сам - см. Ссылку в ответе. – lonesomeday

2

То, что вы есть массив объектов. Я предложил бы повторно манипуляция массива по идентификатору, как это:

$new = array(); 
foreach($array as $obj) { 
    $new[ $obj->id ] = $new[ $obj->label ]; 
} 

Теперь у вас есть хороший ассоциативный массив, который вы можете использовать, как правило, например, echo $new[92] будет эхо «Лодка»

+0

+1 Хорошее решение. – lonesomeday

Смежные вопросы