2016-12-12 1 views
0

Я возвращаю этот массив объектов из вызова API так. Обратите внимание, что $ результат представляет собой массив из массивов с $ результата [данные] холдинговый список TODO объектов и привести [успех] держит статус API вызова:Ссылка на элемент в цикле foreach с использованием php unset

 array(9) { [0]=> object(stdClass)#3 (5) { ["todo_id"]=> string(10) "1480430478" ["title"]=> string(13) "Check Printer" ["description"]=> string(8) 
    "Room 233" ["due_date"]=> string(10) "11/29/2016" ["is_done"]=> string(4) "true" } [1]=> object(stdClass)#4 (5) { ["todo_id"]=> string(10) "148043046" ["title"]=> string(18) "Doctor Appointment" ["description"]=> string(7) 
    "@4pm. " ["due_date"]=> string(10) "11/30/2016" ["is_done"]=> string(4) "true" } 
     etc.. 

сортировать массив с usort штрафом, а затем я хочу прибегнуть в поле «is_done» и поместите их внизу списка todo в порядке даты. PHP, чтобы сделать это:

//Sort by is_done 
    foreach($result[data] as $arrayElement) { 
     foreach($arrayElement as $valueKey => $value) { 
      if(($valueKey == 'is_done') && ($value == 'true')){ 
       $temp = $arrayElement; 
      //delete this particular object from the $array 
       unset($result[data][$arrayElement]); 
       array_push($result[data], $temp); 
      } 
     } 
    } 

Проблема У меня есть мои законченные элементы теперь в конце массива, но они также по-прежнему в их исходное положение. Сброс не работает. Я пробовал все варианты ссылки на элемент $ result [data] безрезультатно. Это, вероятно, что-то простое, но мне нужна помощь, если это возможно. Поиск в Google и проверка этого сайта не показывают примеров отмены в этом типе ситуации. Заранее спасибо.

Update: после нанесения раствора colburton в API-интерфейс теперь возвращается эта структура данных:

object(stdClass)#3 (6) { ["2"]=> object(stdClass)#4 (5) { ["todo_id"]=> int(1480698596) ["title"]=> string(7) "Test #4" ["description"]=> string(4) "test" ["due_date"]=> string(10) "12/02/2016" ["is_done"]=> string(5) "false" } ["3"]=> object(stdClass)#5 (5) { ["todo_id"]=> string(10) "1480617975" ["title"]=> string(13) "Check Printer" ["description"]=> string(4) 
"Test" ["due_date"]=> string(10) "12/06/2016" ["is_done"]=> string(5) "false" } ["5"]=> object(stdClass)#6 (5) { ["todo_id"]=> int(1481136023) ["title"]=> string(9) "Todo item" ["description"]=> string(7) "test123" ["due_date"]=> string(10) "01/19/2017" ["is_done"]=> string(5) "false" } etc... 

В конце разговора я сделать

//json_decode the result 
     $result = @json_decode($result); 

     //check if we're able to json_decode the result correctly 
     if ($result == false || isset($result->success) == false) { 
      throw new Exception('Request was not correct'); 
     } 

     //if there was an error in the request, throw an exception 
     if ($result->success == false) { 
      throw new Exception($result['errormsg']); 
     } 

     //if everything went great, return the data 
     return $result->data; 
    } 

, а затем в основной программе Я ссылаюсь на $ result как

$result = $todo_items[0]; 

И вот тут происходит фатальная ошибка.

Update II: Хотел добавить, что вы тогда должны индексировать массив со

$result['data'] = array_values($result['data']); 

Я читал here, что это ошибка в json_decode. Спасибо за помощь ....

ответ

1

Пожалуйста, используйте кавычки вокруг индексов массива. Это unsets, что вы хотите:

foreach ($result['data'] as $idx => $arrayElement) { 
    foreach ($arrayElement as $valueKey => $value) { 
     if (($valueKey == 'is_done') && ($value == 'true')) { 
      $temp = $arrayElement; 
      //delete this particular object from the $array 
      array_push($result['data'], $temp); 
      unset($result['data'][$idx]); 
     } 
    } 
} 
+0

Спасибо. но теперь я получаю сообщение об ошибке «Неустранимая ошибка: нельзя использовать объект типа stdClass as array» в строке 91 моей программы todo_client, где я ссылаюсь на $ result как «$ result = $ todo_items [0];» Перед этим я использую json_decode. Я где-то читал об удалении элементов и с помощью json_decode вам нужно переиндексировать массив? – alan

+0

Вы можете «переиндексировать» с помощью array_values. Например. $ result ['data'] = array_values ​​($ result ['data']); после петель. – colburton