【问题标题】:working with two arrays in foreach, is this example possible?在 foreach 中使用两个数组,这个例子可行吗?
【发布时间】:2015-06-24 09:55:11
【问题描述】:

我正在使用两个数组,$local 和 $national。目前,它们都在各自独立的 foreach 循环中,我使用如下:

$list // 1st array
$national // 2nd array
$numberlist = array();
$numbernational = array();

foreach($list as $rows)
{
    // here I have a bunch of code that defines the variable $cheapestdeliverydate
    if(strtotime(date('DjMY', strtotime($_GET['inputDate']))) >= strtotime($cheapestdeliverydate))
    {
        $numberlist[] = $rows;
    }
}

foreach($national as $rows)
{
    // here I have a bunch of code that defines the variable $cheapestdeliverydate
    if(strtotime(date('DjMY', strtotime($_GET['inputDate']))) >= strtotime($cheapestdeliverydate))
    {
        $numbernational[] = $rows;
    }
}

有没有办法合并这两个 foreach 函数?我尝试了以下方法:

foreach(array_merge($list, $national) as $rows)
{
    if(strtotime(date('DjMY', strtotime($_GET['inputDate']))) >= strtotime($cheapestdeliverydate))
    {
        $numberlist[] = $rows;
        $numbernational[] = $rows;
    }
}

但不幸的是,当我对 $numberlist 和 $numbernational 执行 print_r 时,它们都返回完全相同的数组。事后看来,现在这对我来说是有意义的,所以我想知道我是否可以按照以下方式做一些事情:

foreach($list as $row, $national as $rows)
{
    if(strtotime(date('DjMY', strtotime($_GET['inputDate']))) >= strtotime($cheapestdeliverydate))
    {
        $numberlist[] = $row;
        $numbernational[] = $rows;
    }
}

$list 和 $national 数组的大小相同。

【问题讨论】:

  • 您遇到了什么错误?编写这两个数组的格式树
  • 数组有什么关联吗?它们是否包含相同数量的行?你得到什么服务器错误(这类信息对于诊断问题非常有用,所以告诉我们你得到什么错误会有所帮助……这个错误不是国家机密吗?)
  • 如果您需要像 atm 那样将 foreach 的结果分成两个数组(numbernationalnumberlist),那么我会保留两个 foreach 循环,因为您可能想做一些不同的事情天。
  • @MarkBaker 刚刚编辑了这个问题。两个数组包含相同数量的行。这次我没有收到服务器错误,所以可能是我的本地主机在那个特定时间播放。有什么想法吗?
  • $cheapestdeliverydate 是如何计算的?它是否取决于来自$list 和/或$national 的值?

标签: php foreach


【解决方案1】:

您可以使用 SPL 的 MultipleIterator 一次遍历两个数组

$numberlist = [];
$numbernational = [];

$mi = new MultipleIterator();
$mi->attachIterator(new ArrayIterator($list));
$mi->attachIterator(new ArrayIterator($national));
$result = array();
foreach($mi as list($listRow, $nationalRow)) {
    if (strtotime(date('DjMY', strtotime($_GET['inputDate']))) >= strtotime($cheapestdeliverydate)) {
        $numberlist[] = $listRow;
        $numbernational[] = $nationalRow;
    }
}

【讨论】:

  • 请注意,您以前曾多次来救我。我唯一的问题是目前每个 foreach 都引用了 $rows,例如if ($rows['delivery'] == '1' && $deliverycost != -1) {。我将如何使用 MultipleIterator 克服这个问题,因为您的 foreach 现在读取的是 foreach($mi as list($listRow, $nationalRow)) { 而不是 foreach($mi as $rows)) {?谢谢
  • 在循环中,$listRow 引用了 $list 数组中的行,而 $nationalRow 引用了 $national 数组中的行......你可以引用 $listRow['delivery']$nationalRow['delivery']分别
  • 我尝试了自己的 MultipleIterator 版本,但失败了。你是天才,唯一真正了解我的人。需要一个聪明的人投反对票,但需要一个天才来解决。
【解决方案2】:

由于您的代码逻辑,它必须只是

$list // 1st array
$national // 2nd array
$numberlist = array();
$numbernational = array();

if(strtotime(date('DjMY', strtotime($_GET['inputDate']))) >= strtotime($cheapestdeliverydate) 
    {
        $numberlist = $list;
        $numbernational = $national;
    }

【讨论】:

    【解决方案3】:

    尝试类似:

    $all = array_merge($list, $national);
    
    foreach($all as $rows)
    {
        if(strtotime(date('DjMY', strtotime($_GET['inputDate']))) >= strtotime($cheapestdeliverydate))
        {
            $numberlist[] = $rows;
            $numbernational[] = $rows;
        }
    }
    

    【讨论】:

    • 这与我尝试的解决方案完全相同,但不起作用。问题是没有办法区分 $numberlist 和 $numbernational。它们都产生相同的数组,这是不应该发生的。
    • 您在编辑帖子之前遇到的问题是您遇到了 500 服务器错误。请不要像那样改变你的问题范围。
    • 我可以根据自己的喜好改变我的问题,特别是如果它使它更相关的话。而且无论我是否得到 500,您的答案仍然无效,因为它只是重复了我尝试过的尝试,但失败了。
    • 它可能会解决它,因为合并的结果将不再是一个临时变量。由于这个事实,某些主机或 php 版本可能会崩溃。
    猜你喜欢
    • 2019-06-13
    • 1970-01-01
    • 1970-01-01
    • 2016-06-11
    • 2015-04-04
    • 1970-01-01
    • 1970-01-01
    • 2018-12-11
    • 1970-01-01
    相关资源
    最近更新 更多