【问题标题】:Add elements to associative array in foreach loop在 foreach 循环中将元素添加到关联数组
【发布时间】:2016-03-06 13:32:09
【问题描述】:

我正在为 Android 应用创建自己的 API,但我似乎无法解决这个问题。 (注意这是我的第一个 php 项目)。

我想要实现的是向关联数组添加一个元素,然后将其编码为 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
         }
   ]
}

【问题讨论】:

  • $arr = array("photos"=>array('media_id' = $media_id, 'hasLiked' => 1));
  • 或者循环外..encode_json(array("photos"=>$arr));
  • 我认为 encode_json 在这里是错字
  • @devpro 嘿,感谢您的回答,但由于有 2 个循环,第一个是一个函数,我不能调用 encode_json (我自己的函数只做 echo(json_encode($foo) ,它不是错字哈哈)在 $arr 上,因为它是在函数内部声明的变量。我不知道我是否解释正确。
  • 你在需要照片的地方使用索引

标签: php json api instagram instagram-api


【解决方案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);
}

【讨论】:

  • 谢谢,刚刚试过,但输出如下:[[{"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}]]
  • 它正在创建第二个条目,而不是修改第一个条目以防它被点赞。
  • 您是否多次调用该函数?
【解决方案2】:

只需替换这一行:

json_encode($arr);

与:

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

【讨论】:

    【解决方案3】:

    好的,我试图在函数内部创建数组,但我应该在调用函数后完成它。我使用该函数返回用户是否喜欢照片作为布尔值。代码是:

    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));
    }
    

    【讨论】:

      猜你喜欢
      • 2019-03-31
      • 2021-05-14
      • 2012-01-23
      • 1970-01-01
      • 1970-01-01
      • 2011-03-07
      • 1970-01-01
      • 2011-10-23
      • 2019-09-09
      相关资源
      最近更新 更多