2013-06-27 2 views
0

У меня есть массив, который выглядит следующим образом:Аранжировка массив в цикле

array(
    0 => object //ticket, 
    1 => object //user, 
    2 => object //employee, 
    3 => object //ticket, 
    4 => object //user 
    5 => object //ticket, 
    6 => object //employee 
); 

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

array(
    [0] => array(
     [0] => object //ticket, 
     [1] => object //user, 
     [2] => object //employee, 
    ) 
) 

Что у меня возникают проблемы с является, так как пользователь и работник не являются обязательными, я не знаю, как правильно индекс, основанный на вышеупомянутая модель, так как иногда я ударяю то, что не имеет сотрудника или пользователя (в случае, если это не так, я бы хотел, чтобы этот индекс был нулевым). Есть идеи?

EDIT: Пример:

for ($i = 0; $i < count($result); $i++) { 
     if ($result[$i] instanceof Ticket) { 
      continue; 
     } else { 
      $newResult[$i][] = $result[$i]; //maybe I'm brainfarting, but cannot figure how to identify the last ticket index 
     } 
    } 
+1

Можете ли вы опубликовать пример того, что вы пробовали? Этот или теоретический (нерабочий) пример кода, который вы хотели бы иметь, будет полезен для понимания того, что вы хотите сделать. code> words :) – mattexx

+0

Ну, как только вы нажмете еще один тикер, вы перестанете заполнять текущий массив и начнете использовать новый. –

+0

Объекты связаны на основе их идентификаторов, сами объекты являются объектами доктрины и извлекаются через соединение построителя запросов. Если бы какая-то доктрина могла сделать это автоматически, я был бы намного счастливее. Но по какой-то причине он возвращает их как отдельные индексы в массиве. – jonathonh

ответ

1

Это похоже на ваш ответ, но не требует переиндексации $newResult, когда это сделано.

$newIndex = -1; 
$newResult = array(); 
foreach ($result as $object) { 
    if ($object instanceof Ticket) { 
     $newResult[] = array($object); 
     $newIndex++; 
    } else { 
     $newResult[$newIndex][] = $object; 
    } 
} 

Однако ваш первоначальный вопрос упомянутой установки неиспользуемых элементов подрешетки в null. Ваш ответ этого не делает, поэтому я тоже этого не сделал.

0

Вы можете проверить с InstanceOf, какой класс элемент экземпляра текущий массив является, а затем группа как вы предпочитаете :)

Пример

if($array[0] instanceof ticket) { 
    // do some magic in here 
} 

http://php.net/manual/en/internals2.opcodes.instanceof.php

+0

Yup Я делаю это. Моя проблема заключается в том, как я могу скомпоновать ее с последним индексом билета? – jonathonh

0

Да, я определенно мозг. Извините за тратить время anyones, вот цикл:

$lastTicketIndex = 0; 
    for ($i = 0; $i < count($result) - 1; $i++) { 
     if ($result[$i] instanceof Ticket) { 
      $newResult[$i][] = $result[$i]; 
      $lastTicketIndex = $i; 
      continue; 
     } else { 
      $newResult[$lastTicketIndex][] = $result[$i]; 
     } 
    } 
+1

Когда вы закончите, вы должны сделать '$ newResult = array_values ​​($ newResult)' для нумерации индексов последовательно. – Barmar