2015-11-27 2 views
0

У меня есть массив, который содержит данные из базы данных:Почему мой массив increamenting PHP Laravel 5

$responses = FormResponses::where('form_id', '>=', $phoneFirstElement->id)->where('form_id', '<=', $phoneLastElement->id)->get(); 
$responsesArray = $responses->toArray(); 

Тогда мой вложенный цикл:

foreach ($phone as $key => $value2) // Populate Phone Numbers Horizontally 
    { 
     $sheet->cell($start.'9', $value2->phone); 
     // This will fill the responses for each number 
     foreach ($metrics as $key => $value) 
     { 
     $form_id = $value2->id; 
     $metrics_id = $value->id; 
     $neededObjects = array_filter(
      $responsesArray, 
      function ($e) use ($form_id, $metrics_id) { 
       return $e['form_id'] == $form_id && $e['metrics_id'] == $metrics_id; 
      } 
     ); 
     var_dump($neededObjects); 
     exit; 

     //$responses = FormResponses::where('form_id', '=', $value2->id)->where('metrics_id', '=', $value->id)->get(); 
     //$sheet->cell($start.$count, $neededObjects[$counter]['response']); 
     $sheet->cell('C'.$count, $value->question); 
     $sheet->cell('B'.$count, $value->description); 
     $sheet->cell('A'.$count, $value->metrics_name); 
     $counter++; 
     $count++; 
     $neededObjects = array(); 
     } 
     $start++; 
     $count = 10; 
     //$counter = 0; 
    } 

Моих $responsesArray это данные, которые имеют много запись, поэтому я хочу извлечь эти данные, чтобы получить конкретную информацию, необходимую мне, используя array_filter и сохранить ее в

$neededObjects 

Однако, когда я делаю var_dump я получаю что-то вроде

array (size=1) 
    0 => 
    array (size=7) 
     'id' => int 141730 
     'form_id' => int 4430 
     'metrics_id' => int 1 
     'response' => string 'Yes' (length=3) 
     'remarks' => string '' (length=0) 
     'created_at' => string '2015-11-23 19:30:07' (length=19) 
     'updated_at' => string '2015-11-23 19:30:07' (length=19) 

Тогда, когда следующая запись петель в

array (size=1) 
    1 => 
    array (size=7) 
     'id' => int 141731 
     'form_id' => int 4430 
     'metrics_id' => int 2 
     'response' => string 'Yes' (length=3) 
     'remarks' => string '' (length=0) 
     'created_at' => string '2015-11-23 19:30:07' (length=19) 
     'updated_at' => string '2015-11-23 19:30:07' (length=19) 

Я не понимаю, почему это increamenting. Первый - 0, затем следующий - 1. Да, учитывая, что я делаю array_filter внутри вложенного цикла, но я не помещал в него никаких обращений, и фильтр массивов даст мне 1 запись данных, поэтому я ожидаю, что он по крайней мере будет в индексе 0 или просто в формате например:

array (size=7) 
    'id' => int 141731 
    'form_id' => int 4430 
    'metrics_id' => int 2 
    'response' => string 'Yes' (length=3) 
    'remarks' => string '' (length=0) 
    'created_at' => string '2015-11-23 19:30:07' (length=19) 
    'updated_at' => string '2015-11-23 19:30:07' (length=19) 

ответ

0

Любые результаты, которые возвращаются array_filter, сохраняют свои старые ключи. Если вы хотите сбросить ключи, примените array_values к результату.

Если вы хотите получить только один результат, то позвоните current() или array_pop(), чтобы получить первую запись.

Даже если array_filter возвращает одну запись, она все равно будет в исходном массиве с тем же ключом.

+0

array_values ​​отлично выполняет сброс ключа до 0. Спасибо. Выберете этот ответ. – jackhammer013

0

array_filter возвращает элементы массива с неповрежденными ключами в зависимости от вашей функции фильтра. Таким образом, ключи (0, 1 и т. Д.) Являются ключами в вашем исходном массиве. Используйте array_pop, чтобы получить единственный элемент в вашем массиве.

+0

Я пробовал делать array_pop ($ neededObjects); после $ count ++; и все тот же. Интересно, откуда взялись эти ключи (0,1,2,3,4 ..). – jackhammer013

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