2016-03-06 3 views
0

Я создаю свой собственный API для приложения для Android, но, похоже, я не могу это решить. (Обратите внимание, что это мой первый проект php).Добавить элементы в ассоциативный массив в цикле foreach

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

Это функция с петлей

function checkLike($media_id, $user1_id, $access_token){ 

    $url = 'https://api.instagram.com/v1/media/'.$media_id.'/likes?access_token='.$access_token; 

    $json1 = file_get_contents($url); 

    $arr1 = json_decode($json1); 

    $arr = array('media_id' => $media_id, 'hasLiked' => 0); 


    if(is_array($arr1->data)){  
     foreach ($arr1->data as $key => $value) { 
      //echo 'Comprobando el id '.$value->id.' deberia ser '. $user1_id.' '; 

      if($value->id === $user1_id){ 
       $arr = array('media_id' => $media_id, 'hasLiked' => 1); 
      }else{ 
       echo 'nope'; 
      } 

     }encode_json($arr); 
    }else{ 
     echo 'false1'; 
    } 

} 

и это другая петля она вызывается из

$json = file_get_contents('https://api.instagram.com/v1/users/self/media/recent/?access_token='.$token.'&count=5'); 

$arr = json_decode($json); 



if (is_array($arr->data)) { 
    foreach ($arr->data as $key => $value) { 
     checkLike($value->id, get_user_id($user, $token), $token); 
    } 
} 

Однако JSON я получаю следующее:

{"media_id":"1198059901794013237_483636171","hasLiked":0} 
{"media_id":"1196611512178987610_483636171","hasLiked":1} 
{"media_id":"1195162888588906891_483636171","hasLiked":1} 
{"media_id":"1193726158308528216_483636171","hasLiked":1} 
{"media_id":"1192260158916546943_483636171","hasLiked":1} 

Что мне нужно сделать, чтобы получить что-то вроде этого?

{ 
    "photos":[ 
     { 
     "mediaID":"1198059901794013237_483636171", 
     "hasLiked":0 
     }, { 
     "mediaID":"1196611512178987610_483636171", 
     "hasLiked":1 
     } 
    ] 
} 
+0

'$ обр = массив ("фотографии"=> Array ('media_id' = $ media_id,«hasLiked '=> 1)); ' – devpro

+0

Или вне цикла ..' encode_json (array ("photos" => $ arr)); ' – devpro

+0

Я думаю, что encode_json здесь опечатка – devpro

ответ

0

Просто замените эту строку:

json_encode($arr); 

С:

json_encode(array("photos"=>$arr)); 
1

Вы переписав массив с каждой петлей. В вашем изменении контура эта строка выглядит следующим образом:

$arr[] = array('media_id' => $media_id, 'hasLiked' => 1); 

$arr будет представлять собой массив массивов и когда при вызове json_encode($arr) вне цикла, вы получите все данные в одной строке JSON.

Здесь полностью фиксированный код - это должно работать, но я не пробовал:

function checkLike($media_id, $user1_id, $access_token){ 

    $url = 'https://api.instagram.com/v1/media/'.$media_id.'/likes?access_token='.$access_token; 

    $json1 = file_get_contents($url); 

    $arr1 = json_decode($json1); 

    // Initialize and add first element to array 
    $arrJSON[] = array('media_id' => $media_id, 'hasLiked' => 0); 

    if(is_array($arr1->data)){ 

     foreach ($arr1->data as $key => $value) {   

      if($value->id === $user1_id){ 

       // Add to $arrJSON 
       $arrJSON[] = array('media_id' => $media_id, 'hasLiked' => 1); 

      }else{ 

       echo 'nope'; 

      } 
     } 

    } else { 

     echo 'false1'; 

    } 

    // Encode entire array as JSON and echo 
    echo json_encode($arrJSON); 
} 
+0

Спасибо, просто попробовал это, но это результат: '[[{media_id": "1198059901794013237_483636171", "hasLiked": 0}]] [[{media_id ":" 1196611512178987610_483636171 "," hasLiked ": 0}, {"media_id": "1196611512178987610_483636171", "hasLiked": 1}]] [["media_id": "1195162888588906891_483636171", "hasLiked": 0}, {"media_id": "1195162888588906891_483636171", "hasLiked": 1} ]] [[{media_id ":" 1193726158308528216_483636171 "," hasLiked ": 0}, {" media_id ":" 1193726158308528216_483636171 "," hasLiked ": 1}]] [[{media_id": "1192260158916546943_483636171", "hasLiked ": 0}, {" media_id ":" 1192260158916546943_483636171 "," hasLiked ": 1}]]' – ivykoko

+0

Создает вторую запись вместо изменения первой, если она понравилась. – ivykoko

+0

Nvm, я решил, спасибо! – ivykoko

0

Хорошо, я пытаюсь создать массив внутри функции, но я должен был сделать это после того, как была вызвана функция. Я использовал функцию, чтобы вернуться к пользователю, когда пользователю понравилась фотография как логическая. Код:

checkLike функция

function checkLike($media_id, $user1_id, $access_token){ 

    $url = 'https://api.instagram.com/v1/media/'.$media_id.'/likes?access_token='.$access_token; 

    $json1 = file_get_contents($url); 

    $arr1 = json_decode($json1); 

    $hasLiked = false; 

    if(is_array($arr1->data)){  
     foreach ($arr1->data as $key => $value) { 
      //echo 'Comprobando el id '.$value->id.' deberia ser '. $user1_id.' '; 

      if($value->id === $user1_id){ 
       $hasLiked = true; 
      }else{ 
       echo 'nope'; 
      } 

     } 
    }else{ 
     echo 'false'; 
    } 

    return $hasLiked; 

} 

Основной код:

$json = file_get_contents('https://api.instagram.com/v1/users/self/media/recent/?access_token='.$token.'&count=5'); 

$media_array= json_decode($json); 

if (is_array($media_array->data)) { 
    foreach ($media_array->data as $key => $value) { 
     $mediaID = $value->id; 
     if(checkLike($mediaID, get_user_id($user, $token), $token)){ 
      $arrJSON[] = array('media_id' => $mediaID, 'hasLiked' => 1); 
     }else{ 
      $arrJSON[] = array('media_id' => $mediaID, 'hasLiked' => 0); 
     } 
    } 

    encode_json(array('photos'=>$arrJSON)); 
} 
Смежные вопросы