PHP:解析一个关联数组来比较数组中的每两个值

时间:2016-03-28 18:47:19

标签: php associative-array

下面我试图解析一个关联数组。

数组看起来像:

$array1 = [Date1 => Time1, Date2 => Time2, Date3 => Time3,……..]

这里,当我解析数组时,我想对数组的每两个元素执行操作。即Date1Time1与Date2Time2,Date3Time3与Date4Time4进行比较,依此类推。

所以下面我使用while循环解析数组并将值传递给函数creating_detailed_array()

while (list($var, $val) = each($array1)) {
    if($GLOBALS['counter'] < 4) {
        creating_detailed_array($var,$val);
    } else {
        $GLOBALS['counter'] = 1;
        creating_detailed_array($var,$val);
    }
}   

假设1:我已将$GLOBALS['counter']定义为值为1的全局计数器

Assumption2:这里Date1,Time1,Date2,Time2是我在PHP页面顶部定义的变量,考虑到全局范围如下。

以下是被叫函数:

//Global Variables
$Date1 = "";
$Time1 = "";
$Date2 = "";
$Time2 = "";


function creating_detailed_array(&$var,&$val)
{
    //Below I am creating variable named Var1 and Var2 dynamically to store the values of Date1 and Time1 and so on
    ${'Var' . $GLOBALS['counter']} = $var;
    ${'Var' . ($GLOBALS['counter'] + 1)} = $val;
    if($GLOBALS['counter'] = 1) {
        //Trying to store the values in the global variables Date1 and Time1 for future use
        $GLOBALS["Date1"] = $Var1;
        $GLOBALS["Time1"] = $Var2;
    } else {
        //Trying to save the values in global variables Date2 and Time2 for future use.
        $GLOBALS["Date2"] = $Var3;
        $GLOBALS["Time2"] = $Var4;
    }
    echo '<br> Value of Variable 1 : ' . $GLOBALS["Date1"] . 'Value of Variable 2 : ' . $GLOBALS["Time1"] . 'Value of Variable 3 : ' . $GLOBALS["Date2"] . 'Value of Variable 4 : ' . $GLOBALS["Time2"] . '<br>';

    $GLOBALS['counter'] = $GLOBALS['counter'] + 2;     
}

现在的问题是,当解析第一次进入代码时,我得到了正确的值存储在Date1和Time1中,当循环解析值为Date2和Time2时,则Date1和Time1的值被设置为空值。

因为我想将Assoc数组的第一个元素与第二个,第三个与第四个进行比较,依此类推。

我希望将Date1和Time1以及Date2和Time2值存储在变量中以供将来用于比较。但是对于每个解析,我得到了一对中的任何一个。

我怀疑我错误地分配了全局变量。

解释起来有点复杂。如果您需要更多信息,请与我们联系。我使用的PHP版本是5.5

2 个答案:

答案 0 :(得分:0)

感谢您的帮助,我通过这个聪明的current()和key()解决方案极大地减少了我的代码行。但我仍然离我想要的一步之遥。

首先是代码:

$Date1 = "";
$Time1 = "";
$Date2 = "";
$Time2 = "";

while (list($var, $val) = each($array1)) {
        echo '<br>##### Value of' . $var . 'is' . $val . '<br>';
        if($Date2 != $var and $Time2 != $val)
        {
        $Date1 = $var;
        $Time1 = $val;
        $Date2 = key($array1);
        $Time2 = current($array1);
         echo '<br> Value : ' . $Date1;
  echo '<br> Value : ' . $Time1;
  echo '<br> Value : ' . $Date2;
  echo '<br> Value : ' . $Time2;

        }
}

正如我前面所述,我的数组是以下形式 $ array1 = [27/03/2016 =&gt; 12:00,28/03/2016 =&gt; 01:00,29 / 03/2016 =&gt; 02:00,30 / 03/2016 =&gt; 03:00,....]

现在,我想比较这个数组中每两个元素的对。 意味着,我想比较(Date1与Date2和Time1与Time2)(Date3与Date4和Time3与Time4)。

所以当我第一次进入数组时,我会捕获Date1,Time1,Date2,Time2,然后我需要跳过其间的指针并跳转到Date3然后捕获(Date3,Date4和Time3以及Time4)。所以在第一次迭代中我想设置

的值

$ Date1 = 27/03/2016

$ Time1 = 12:00

$ Date2 = 28/03/2016

$ Time2 = 01:00

然后在第二次迭代中。 我想设置

$ Date1 = 29/03/2016

$ Time1 = 02:00

$ Date2 = 30/03/2016

$ Time2 = 03:00

然后继续..............

所以我在这里使用一个if子句跳过一个循环到一个条件然后跳转到next,但它没有跳过它,因为变量的值在进入下一次迭代的循环时不会持久化。所以目前上面的代码正在取得结果。

第一次迭代:

$ Date1 = 27/03/2016

$ Time1 = 12:00

$ Date2 = 28/03/2016

$ Time2 = 01:00

第二次迭代:

$ Date1 = 28/03/2016

$ Time1 = 01:00

$ Date2 = 29/03/2016

$ Time2 = 02:00

您可以在其中看到第一次运行中的Date2和Time2与第二次中的Date1和Time1相同,这是不需要的。所以当我第一次尝试使用全局变量时,我尝试使用全局变量,但之后它就不起作用了。那么这里有什么建议吗?

我希望这次我能更好地解释它。

答案 1 :(得分:0)

感谢各位提供的提示,我自己得到了答案。 我只是使用next()跳过一个位置并将指针指向下一个位置 下面是代码,它完全符合我的预期。

$Date1 = "";
$Time1 = "";
$Date2 = "";
$Time2 = "";

while (list($var, $val) = each($array1)) {
        echo '<br>##### Value of' . $var . 'is' . $val . '<br>';
        if($Date2 != $var and $Time2 != $val)
        {
        $Date1 = $var;
        $Time1 = $val;
        $Date2 = key($array1);
        $Time2 = current($array1);
         echo '<br> Value : ' . $Date1;
         echo '<br> Value : ' . $Time1;
         echo '<br> Value : ' . $Date2;
         echo '<br> Value : ' . $Time2;
         next($array1); // Here is the line that was required to make it work
        }
}

再次感谢您提供的提示。此问题可以标记为已解决。