【问题标题】:Cycle from array - PHP从数组循环 - PHP
【发布时间】:2015-01-13 11:13:12
【问题描述】:

我有一个来自 SQL 的数组,其中包含语言和使用该语言的用户数量。

数组看起来像:

"$languages" => array (5)
12 => "CZ" (2)
4 => "SK" (2)
3 => "DE" (2)
2 => "RO" (2)
6 => NULL

如您所见,此数组已还原。我想对它们进行统计,但这对我来说是个问题,因为我能得到这个值的唯一方法就是写一个它的计数(这将改变 ofc)

$langauges[12] -  answer CZ
$languages[CZ] -  answer error

有没有办法让我从这个数组循环,让我们说它回显到一些 HTML?

我想要的是:

<div>
<div class="country"> CZ </div>
<div class="number"> 12 </div>
</div>

SQL 看起来像:

function getLanguageStatistic()
{
    return $this->db->fetchPairs('SELECT COUNT(*), language FROM users GROUP BY language ORDER BY COUNT(language) DESC');
}       

【问题讨论】:

  • foreach ($array as $k =&gt; $v)
  • &lt;?php foreach($languages as $key =&gt; $value){...}?&gt; $key 将是 12,$value 将是 CZ。 1 个简单的问题,如果 2 种语言的计数相同会发生什么??
  • 我们可以看到 SQL 请求吗?我认为我们可以在使用它之前做一些事情!
  • @Spoke44 问题已更新 :) CodeBird 我不知道,如果你有任何其他想法告诉我 :)
  • @Andurit 如果您对 2 种语言有相同的计数,您的数组将不会有用。你有两种方法可以解决这个问题。 1 您的数组键应该是语言名称而不是计数,或者您使用了索引以 0 开头的多维数组,然后是语言和计数。例如 $languages[0]['lang']='CZ'; $languages[0]['count']=12。 寻求spoke44解决方案

标签: php arrays cycle


【解决方案1】:

首先,命名行。

$request = $this->db->query("SELECT COUNT(*) as nbr
                                  , language FROM users 
                             GROUP BY language 
                             ORDER BY COUNT(language) DESC");

然后(使用 PDO,但对其他人相同):

$datas = $request->fetchAll();

foreach($datas as $elem){
  echo '<div>
            <div class="country">'.$elem["language"].'</div>
            <div class="number">'.$elem["nbr"].'</div>
        </div>';
}

【讨论】:

  • 说话,这真的开始有意义,不幸的是如果我使用你的查询代码,我的“$datas”转储是空白的array (1) "$languages" =&gt; NULL
  • @Andurit:你使用 PDO 吗?因为,我用了$this->db->query,也许你之间有一个抽象层...
  • 我刚刚发现我没有调用这个 $request,所以在我的网站上失败了(看起来我看这段代码太久了),无论如何这是正确的答案。非常感谢您的帮助
【解决方案2】:

首先使用asort() 对您的数组进行排序,然后再使用foreach

asort($languages);

foreach ($language as $frq => $acronym): ?>
    <div>
        <div class="country"> <?php echo $acronym; ?> </div>
        <div class="number"> <?php echo $frq; ?> </div>
    </div>
<?php endforeach; ?>

但是你的结构有错误:

AZ 有 12 个用户
LT 有 12 个用户

LT 覆盖数组键中的 AZ。更好地使用这种结构:

$languages = [
    [
        'country' => 'AZ',
        'number' => 12,
    ],
    [
        'country' => 'LT',
        'number' => 12,
    ],
];

【讨论】:

    【解决方案3】:
    Use a foreach loop to iterate through all the address, as seen below:
    
    foreach($blockIP as $ip)
    {
        if($_SERVER['REMOTE_ADDR'] == $ip){
            echo 'blocked';
        }else{
            echo 'not blocked';
        }
    }
    If you only need to check to see if the current address is in the array, use the in_array() function:
    
    if(in_array($_SERVER['REMOTE_ADDR'], $blockIP)){
        echo 'blocked';
    }else{
        echo 'not blocked';
    }
    

    【讨论】:

    • 什么地址?你只是复制另一个问题的答案并粘贴到这里吗?
    猜你喜欢
    • 2012-02-24
    • 2011-10-08
    • 1970-01-01
    • 2021-10-16
    • 2011-06-09
    • 2013-01-19
    • 2012-02-21
    • 2017-07-26
    • 2020-05-17
    相关资源
    最近更新 更多