PHP:解析一个Association数组以比较数组中的每两个值


PHP: Parsing an Associative array to compare every two values within the 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 的全局计数器

假设2:这里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的值被设置为null。

因为我想比较Assoc数组的第一个元素和第二个,第三个和第四个,依此类推

我希望将Date1和Time1以及Date2和Time2值存储在变量中,以便将来进行比较。但对于每一个解析,我都会得到这两个解析中的任意一个。

在这里,我怀疑我没有正确地分配全局变量。

解释起来有点复杂。如果你需要更多信息,请告诉我。我使用的PHP版本是5.5

感谢您的帮助,通过这个聪明的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=>12:00,28/03/2016=>01:00,29/03/2016>>02:00,30/03/2016=>03:00,….]

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

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

$Date1=2016年3月27日

$Time1=12:00

$Date2=2016年3月28日

$Time2=01:00

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

$Date1=2016年3月29日

$Time1=02:00

$Date2=2016年3月30日

$Time2=03:00

然后继续…………..

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

第一次迭代:

$Date1=2016年3月27日

$Time1=12:00

$Date2=2016年3月28日

$Time2=01:00

第二次迭代:

$Date1=2016年3月28日

$Time1=01:00

$Date2=2016年3月29日

$Time2=02:00

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

我希望这次我解释得更好。

感谢各位提供的提示,我自己得到了答案。我只是用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
        }
}

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