2014-12-18 2 views
0

Мне это удалось, оно отлично работает для моих нужд, однако у меня есть ощущение, что должно быть что-то много опрятное.есть ли лучший способ добавить многомерный массив в php?

$shifts = Shift::all(); //I am working with laravel 
$shiftObj = array(); 
$i =0; //I create this temp var to fill the sub object block 
foreach($shifts as $shift){ 
    $shiftObj[$i]['campaign'] = Campaign::find($shift->campaign_id)->name; 
    $shiftObj[$i]['place'] = Places::find($shift->place_id)->name; 
    $shiftObj[$i]['shift_date'] = $shift->shift_date; 
    $shiftObj[$i]['start_time'] = $shift->start_time; 
    $shiftObj[$i]['end_time'] = $shift->end_time; 
    $i++; 
} 
return json_encode($shiftObj); 

С помощью этого кода я получаю следующий ответ:

[{"campaign":"camp1","place":"store1","shift_date":"2014-12-09","start_time":"2014-12-09 00:00:00","end_time":"2014-12-09 15:01:00"},{"campaign":"camp2","place":"store2","shift_date":"2014-12-02","start_time":"2014-12-02 01:00:00","end_time":"2014-12-02 02:00:00"},{"campaign":"camp3","place":"store3","shift_date":"2014-12-30","start_time":"2014-12-30 16:00:00","end_time":"2014-12-31 05:00:00"}] 

Тогда я сделал следующее. (Думаю, что я нашел «лучший способ сделать это»).

$shifts = Shift::all(); 
    $shiftObj = array(); 

foreach($shifts as $shift){ 
    $shiftObj[]['campaign'] = Campaign::find($shift->campaign_id)->name; 
    $shiftObj[]['place'] = Places::find($shift->place_id)->name; 
    $shiftObj[]['shift_date'] = $shift->shift_date; 
    $shiftObj[]['start_time'] = $shift->start_time; 
    $shiftObj[]['end_time'] = $shift->end_time; 

} 
return json_encode($shiftObj); 

И я получил этот результат:

[{"campaign":"camp1"},{"place":"store1"},{"shift_date":"2014-12-09"},{"start_time":"2014-12-09 00:00:00"},{"end_time":"2014-12-09 15:01:00"},{"campaign":"camp2"},{"place":"store2"},{"shift_date":"2014-12-02"},{"start_time":"2014-12-02 01:00:00"},{"end_time":"2014-12-02 02:00:00"},{"campaign":"camp3"},{"place":"store3"},{"shift_date":"2014-12-30"},{"start_time":"2014-12-30 16:00:00"},{"end_time":"2014-12-31 05:00:00"}] 

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

+1

Ваш второй способ не работает, потому что вы создавая новый массив для каждой новой записи. '$ shiftObj [] ['campaign'] = ...;' key равно 0 и '$ shiftObj [] ['place'] = ...;' key is 1. Это похоже на то, что вы делали '$ i = 0; $ shiftObj [$ i] ['campaign'] = ...; $ Я ++; $ shiftObj [$ i] ['place'] = ...; 'который, безусловно, не то, что вам нужно. –

+0

Именно поэтому я использовал эту дополнительную переменную ... Спасибо человеку. – clarenswd

ответ

2

Ловушка с вашим вторым подходом - каждый раз, когда вы делаете $ shiftObj [], вы нажимаете новый массив в конце $ shiftObj, содержащий только одно из ваших свойств.

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

$shifts = Shift::all(); 
$shiftObj = array(); 

foreach($shifts as $shift){ 
    $shiftObj[] = array(
    'campaign' => Campaign::find($shift->campaign_id)->name, 
    'place' => Places::find($shift->place_id)->name, 
    'shift_date' => $shift->shift_date, 
    'start_time' => $shift->start_time, 
    'end_time' => $shift->end_time 
); 
} 

return json_encode($shiftObj); 
+0

Это аккуратно !! Отлично, спасибо! – clarenswd

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