【问题标题】:How to loop through an array without repeating?如何循环遍历数组而不重复?
【发布时间】:2019-05-15 05:01:32
【问题描述】:

我正在尝试从 API 获取数据,我收到了这个

[
    {
        "service": 1,
        "name": "Followers",
        "type": "Default",
        "category": "First Category",
        "rate": "0.90",
        "min": "50",
        "max": "10000"
    },
    {
        "service": 2,
        "name": "Comments",
        "type": "Custom Comments",
        "category": "Second Category",
        "rate": "8",
        "min": "10",
        "max": "1500"
    }
]

我想获取每个服务的类别,而不是重复两次相同的类别。

已编辑* 我有这个代码

            $servers = $this->Setting->Loop('api','WHERE is_active = 1');
            foreach($servers->result() as $server){
                foreach($this->Api_Connect->services($server->api_url, $server->api_key) as $item) {
                    echo '<option data-server='.$server->id.' data-percent='.$server->addon_percent.' data-price='.$item['rate'].' data-min='.$item['min'].' data-max='.$item['max'].' value="'.$item['service'].'">- '.$item['name'].'</option>';
                }
            }

它使用 api url 和密钥连接到每个服务器并返回服务。

【问题讨论】:

  • 那么,你试图得到什么结果? Stackoverflow 不是关于你想要实现什么,而是你尝试过和失败过的东西。
  • 您需要实际编写一些代码并尝试一些东西。做一些研究。
  • 我已经编写了整个代码并进行了循环和所有操作,但我无法在不重复的情况下循环分类! prntscr.com/nopllh 所以我在寻求帮助
  • @GamalMohamed 在此处发布您的代码。以后可以删除图像,您的问题不再对任何人有帮助。

标签: php arrays


【解决方案1】:

我们可以设置一个新数组,并在新数组中推送类别,并检查新值是否不存在这样做:

$data = '[
    {
        "service": 1,
        "name": "Followers",
        "type": "Default",
        "category": "First Category",
        "rate": "0.90",
        "min": "50",
        "max": "10000"
    },
    {
        "service": 2,
        "name": "Comments",
        "type": "Custom Comments",
        "category": "Second Category",
        "rate": "8",
        "min": "10",
        "max": "1500"
    },
    {
        "service": 2,
        "name": "Comments",
        "type": "Custom Comments",
        "category": "Second Category",
        "rate": "8",
        "min": "10",
        "max": "1500"
    }
]';

$data = json_decode($data, true);

$category = array();
foreach ($data as $value) {
    if (!array_search($value["category"], $category)) {
        array_push($category, $value["category"]);
    }
}

var_dump($category);

输出

array(2) {
  [0]=>
  string(14) "First Category"
  [1]=>
  string(15) "Second Category"
}

编辑:

根据Andreas的建议,我们也可以在循环中使用if(in_array())

 $category[$value["category"]] = $value["category"]; 

效率更高。

【讨论】:

  • 谢谢!我正在寻找的东西,感谢它。
【解决方案2】:
$array = [];     
foreach($object as $key => $value) { 
        // object is data you receive from API 
        array_push($array,$value->category);
}
// to get unique values 
$array = array_unique($array); 

希望这段代码能解决你的问题

【讨论】:

    【解决方案3】:

    最快的方法是使用array_column
    Array_column 将隔离数组的一列。
    array_column的第三个参数将设置密钥名称。
    这就是我们想要的。
    因为您不希望重复,我们将某些内容设置为值并将“类别”设置为键。

    这意味着它将循环一次并覆盖重复的键。
    此处发布的其他方法需要检查该项目是否已添加到列表中或使用 array_unique 需要将每个项目与每个其他项目进行比较,即slow function 当你给它一个大数组时。

    $data = '[
        {
            "service": 1,
            "name": "Followers",
            "type": "Default",
            "category": "First Category",
            "rate": "0.90",
            "min": "50",
            "max": "10000"
        },
        {
            "service": 2,
            "name": "Comments",
            "type": "Custom Comments",
            "category": "Second Category",
            "rate": "8",
            "min": "10",
            "max": "1500"
        },
        {
            "service": 2,
            "name": "Comments",
            "type": "Custom Comments",
            "category": "Second Category",
            "rate": "8",
            "min": "10",
            "max": "1500"
        }
    ]';
    
    $data = json_decode($data, true);
    
    $category = array_column($data, "rate", "category");
    
    var_dump($category);
    

    输出:

    // Note it's only the keys we want, the values are not interesting
    array(2) {
      ["First Category"]=>
      string(4) "0.90"
      ["Second Category"]=>
      string(1) "8"
    }
    

    【讨论】:

    • 并不总是最好的答案。你的还不错,只是效率有点低。如果您将其更改为将数组中的值添加为关联数组,其中键和值均为“类别”,那么您不需要if(in_array()),如果它比我的答案更快,我不会感到惊讶。意思是 $category[$value["category"]] = $value["category"]; 在你的循环中。不用担心您获得了 25 分!你去购物:-) @Emma
    【解决方案4】:
    $jsonResponse='[
        {
            "service": 1,
            "name": "Followers",
            "type": "Default",
            "category": "First Category",
            "rate": "0.90",
            "min": "50",
            "max": "10000"
        },
        {
            "service": 2,
            "name": "Comments",
            "type": "Custom Comments",
            "category": "Second Category",
            "rate": "8",
            "min": "10",
            "max": "1500"
        }
    ]';
    
    $listData=json_decode(jsonResponse,true);
    
    
    foreach($listData as $valRes){
    echo $valRes['category'];
    
    }
    
    you can get category
    
    
    

    【讨论】:

    • 如果两个服务具有相同的类别它会重复相同的类别两次。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-08-24
    • 2017-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-28
    相关资源
    最近更新 更多