PHP Str_replace在foreach循环中不起作用

时间:2016-02-05 22:31:55

标签: php json str-replace steam-web-api

这是我的代码。

我正在尝试检查蒸汽项目的链接。我试过使用preg_replace但也没有运气。

    $API_link =     sprintf("http://steamcommunity.com/id/*steamid*/inventory/json/730/2?trading=1");
    $json = file_get_contents($API_link);
    $json_output = json_decode($json);
    $result = $json_output;
    $link = array();
    $id = array();
    foreach($result->rgDescriptions AS $item){  
    $empty = array();   
    $newstring = $item->actions[0]->link;
    if($newstring == NULL){
        continue;
    } else {
    $empty['link'] = $newstring;

    array_push($link, $empty);
    }       
    }       
    foreach($result->rgInventory AS $inventory){

        $empty = array();
        if($inventory->instanceid == 0){
            continue;
        } else {
            $empty['id'] = $inventory->id;
            array_push($id, $empty);        
        }
    }

    $array = array_merge($id, $link);

    foreach($array AS $final){

        $assetid = "%assetid%";

        echo str_replace($assetid, $final['id'], $final['link']);

    }

}

但它不起作用。请看看你是否可以提供帮助。

2 个答案:

答案 0 :(得分:0)

描述不够。也许尝试转储一些变量?

foreach($array AS $final){

    $assetid = "%assetid%";

    //Check what is in $final
    var_dump($final);

    echo str_replace($assetid, $final['id'], $final['link']);

}

答案 1 :(得分:0)

我可以看到你有阵列数组:

// bracket squares equivalent of array() keyword PHP >=v5.4
// here is
// $link = array(['link'=>'url'],['link'=>'url'])
// $id   = array(['id'=>'id'],['id'=>'id'])

// result will be:
//   array(['link']=>'url'],['link'=>'url'],['id'=>'id'],['id'=>'id'])
$array = array_merge($id, $link);

foreach($array AS $final){
    // here is the first $final
    // array('link'=>'url')

    $assetid = "%assetid%";

    // but here is we try to get
    // 'id' and 'link'
    echo str_replace($assetid, $final['id'], $final['link']);
}

我认为这是一种错误。

好的,一些测试脚本:

<?php

$a = array( array('link'=>'hello1'), array('link'=>'hello2'));
$b = array( array('id'=>'id0'), array('id'=>'id1'));
$c = array_merge($a, $b);
var_dump($c);

结果:

array(4) {
  [0] =>
  array(1) {
    'link' =>
    string(6) "hello1"
  }
  [1] =>
  array(1) {
    'link' =>
    string(6) "hello2"
  }
  [2] =>
  array(1) {
    'id' =>
    string(3) "id0"
  }
  [3] =>
  array(1) {
    'id' =>
    string(3) "id1"
  }
}

array_merge不会在它们之间混合你的关联数组,也不是特定项目(我希望我解释正确)

当然

foreach ($c as $item) {
  var_dump($item);
}

将逐个枚举所有项目

  array(1) {
    'link' =>
    string(6) "hello1"
  }

  array(1) {
    'link' =>
    string(6) "hello2"
  }

  array(1) {
    'id' =>
    string(3) "id0"
  }

  array(1) {
    'id' =>
    string(3) "id1"
  }

并且项目中没有包含这两者(linkid)的数组

此脚本无法正确关联linkid,因为某些链接可以被continue跳过,某些id也可以被跳过。它只是一个随机的可用信息列表。你可以陷入下一种情况:

 - $links has first 10 links
 - $id has 3,4,5,7,9,11

这只是一个清单。即使您只有此纯信息(没有其他详细信息),也无法使用显示的来源在它们之间正确关联。

这里至少有一个简单的解决方案:

不要跳过,不要合并,只需添加一个空数组,最后一个循环就是这样:

$assetid = "%assetid%";
for ($link as $key=>$final) {
  if (count($final) && count($id[$key])) {
    echo str_replace($assetid, $id[$key]['id'], $final['link']);
  } else {
     // some of needed arguments absent
  }
}