2016-07-31 3 views
0

У меня есть объект, который содержит ключи со значениями, которые являются объектами, а внутри этих объектов есть другие объекты в качестве значения для одного из ключей. Мне удалось получить определенное значение из глубокого вложенного объекта, который мне нужен, выполнив 4 цикла, но мне было интересно, есть ли лучший способ сделать это. Вот объект у меня есть:Зацикливание объекта внутри другого объекта

{ 
    record1: { 
    key1: value1, 
    key2: value2, 
    key3: { 
     key_x1: value_x1, 
     key_x2: value_x2, 
     key_x3: value_x3 
    } 
    } 
    record2: { 
    key1: value1, 
    key2: value2, 
    key3: { 
     key_x1: value_x1, 
     key_x2: value_x2, 
     key_x3: value_x3 
    } 
    } 
} 

Таким образом, для каждой записи (record1 и record2 и т.д.) Мне нужно, чтобы вытащить значение из key_x1 и хранить его в массив. Любые идеи о том, как это сделать без 4 циклов foreach?

EDIT: Вот что у меня есть, который работает, только выглядит некрасиво:

$mainObject 
    $a = []; 
    $dateArray = []; 

    foreach ($mainObject as $individualOb) { 
     $dates = $individualOb->getDate(); 
     $a[] = $dates; 
    } 

    if (empty($a)) { 
     return true; 
    } else { 
     foreach ($a as $date) { 
      foreach ($date as $key => $value) { 
       if ($key == 'date') { 
        $dateArray[] = $value; 
       } 
      } 
     } 
     foreach ($dateArray as $value) { 
      if(strtotime($value) < strtotime('-1 year')) { 
       return true; 
      } 
     } 
    } 
+0

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

+0

это json string? – RomanPerekhrest

+1

Возможный дубликат [Как преобразовать объект в массив?] (Http://stackoverflow.com/questions/2476876/how-do-i-convert-an-object-to-an-array) – user2182349

ответ

0

Вы можете вложить петли, как это:

foreach ($mainObject as $individualOb) { 
    foreach ($individualOb->getDate() as $key => $value) { 
     if ($key == 'date' && strtotime($value) < strtotime('-1 year')) { 
      return true; 
     } 
    } 
} 

Я не знаю, почему вы хотите, чтобы вернуться true когда нет элементов, поскольку false выглядит более логичным. В любом случае вы можете сделать это тест прямо на $mainObject:

if (empty($mainObject)) { 
    return true; 
} else // ...etc. 
+0

игнорировать возврат на данный момент. Эти петли фактически находятся в функции, которую я вызываю в другом месте. Но, с точки зрения фрагмента, который вы опубликовали, я оригинал пробовал вложенность для каждой петли, и он записывал двойную информацию о каждом желаемом значении. Я думаю, что моя проблема заключалась в том, что я не использовал сопряжение ключевых значений для второго цикла foreach. Я дам этот код попробовать и вернусь к вам. :) –

+0

Ну, если ваш код не о возврате false/true, тогда мой ответ может оказаться неприемлемым. Но тогда, пожалуйста, обновите свой вопрос с помощью более подходящего кода. – trincot

+0

Редактировать: просто попробовал, и это работает как шарм. Вы гений sir :) Редактировать 2: mainObject ALWAYS имеет один ключ внутри него, но клавиша THAT может быть пуста, и я думаю, что знаю, как решить проблему сейчас. Еще раз спасибо! –

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