PHP-嵌套的foreach循环中的异常行为 - php

一些背景

我有2个数组,其中包含以下信息:

$x = [
    ['name' => 'Fred', 'ykey' => 'A', 'rank' => '1', 'VIP' => '1'],
    ['name' => 'Fred', 'ykey' => 'B', 'rank' => '2', 'VIP' => '1'],
    ['name' => 'Joe', 'ykey' => 'A', 'rank' => '1', 'VIP' => '1'],
    ['name' => 'Joe', 'ykey' => 'B', 'rank' => '2', 'VIP' => '1'],
    ['name' => 'Frank', 'ykey' => 'A', 'rank' => '1', 'VIP' => '0'],
    ['name' => 'Frank', 'ykey' => 'B', 'rank' => '2', 'VIP' => '0']
]

$y = [
    'A' => [
        'hasVIPmember' => false,
        'slots' = [] //X elements will be placed here
    ]
    'B' => [
        'hasVIPmember' => false,
        'slots' = [] //X elements will be placed here
    ]

目标是仅由一个VIP成员将$x中的每个元素放入$y中。我有一种方法来放置VIP成员,然后再一种方法来放置其他所有人。 $x中的信息是从数据库中获得的。 VIP中的'1'表示true

问题

我在下面的代码的注释中概述了我遇到的问题。

for($i = 1; $i <= 2; $i++){
    foreach($x as $z){
        //all Xs are seen here (after all iterations complete)
        if($z['VIP'] == 1 && $z['rank'] == $i){
            //Only Fred and Joe elements of X are shown here. (after all iterations complete)
            if(!($y[$z['ykey']]['hasVIPmember'])){
                //Only 'Fred' elements are shown here. Why?(after all iterations complete)
                $y[$z['ykey']]['slots'][]= $z;
                $y[$z['ykey']]['hasVIPmember'] = true;
            }
        }
    }
}

因此,问题是,正如您从注释中看到的那样,当我执行if(!($y[$z['ykey']]['hasVIPmember'])){...}时,我只会看到名称为“ Fred”的元素,因此,Fred放置在A和B中。

问题

为什么最终if语句中迭代的项目列表会进一步缩小?有什么办法可以纠正这种行为?

参考方案

当您运行迭代时,Fred在等级1和2上都是第一个。运行时,它会将Fred添加到$ y,然后跳过其余部分,因为此时$ y [hasVIPmember]为true。在使用某种计数器或密钥将Fred添加到任何$ y后,或者更改您的数据集之后,您需要找到一种方法使Fred从运行中无效。

$used = NULL;
for($i = 1; $i <= 2; $i++){
    foreach($x as $z){
        //all Xs are seen here (after all iterations complete)
        if($z['VIP'] == 1 && $z['rank'] == $i){
            //Only Fred and Joe elements of X are shown here. (after all iterations complete)
            if(!($y[$z['ykey']]['hasVIPmember'])){
                // looks for used
                if (!($z['name'] == $used)) {
                    $y[$z['ykey']]['slots'][]= $z;
                    $y[$z['ykey']]['hasVIPmember'] = true;
                    $used = $z['name']; //add Fred to the used name list
                }

            }
        }
    }
}

PHP strtotime困境 - php

有人可以解释为什么这在我的服务器上输出为true吗?date_default_timezone_set('Europe/Bucharest'); var_dump( strtotime('29.03.2015 03:00', time()) === strtotime('29.03.2015 04:00�…

PHP-全局变量的性能和内存问题 - php

假设情况:我在php中运行一个复杂的站点,并且我使用了很多全局变量。我可以将变量存储在现有的全局范围内,例如$_REQUEST['userInfo'],$_REQUEST['foo']和$_REQUEST['bar']等,然后将许多不同的内容放入请求范围内(这将是适当的用法,因为这些数据指的是要求自…

php-casperjs获取内部文本 - php

我正在为casperjs使用php包装器-https://github.com/alwex/php-casperjs我正在网上自动化一些重复的工作,我需要访问一个项目的innerText,但是我尚不清楚如何从casperjs浏览器访问dom。我认为在js中我会var arr = document.querySelector('label.input…

PHP:对数组排序 - php

请如何排序以下数组Array ( 'ben' => 1.0, 'ken' => 2.0, 'sam' => 1.5 ) 至Array ( 'ken' => 2.0, 'sam' => 1.5, 'ben' =&…

PHP-从最后一个循环中删除逗号 - php

我在循环时有一个PHP,如果是最后一个循环,我想从,中删除​​最后一个逗号echo '],'; while($ltr = mysql_fetch_array($lt)){ echo '['; echo $ltr['days']. ' ,'. $ltr['name…