当前位置: 首页 > 面试题库 >

如何一次遍历两个数组?

仇正平
2023-03-14
问题内容

我试图将两个数组排列在一起,结果总是不正确。我将向您展示我的代码,获得的结果以及正在寻找的结果。

我想我只是做错了,但不确定其他方法。

我的代码:

$data1 = [
    'a: 1',
    'a: 2',
    'a: 3',
    'a: 4',
    'a: 5'
];

$data2 = [
    'b: 1',
    'b: 2',
    'b: 3',
    'b: 4',
    'b: 5'
];


foreach($data1 as $item1)
{
    foreach($data2 as $item2)
    {
        echo $item1 . '<br/>';
        echo $item2 . '<br/>';
        echo '<br/><br/>';
    }
}

结果:(缩短以节省空间)

a: 1
b: 1

a: 1
b: 2

a: 1
b: 3

a: 1
b: 4

a: 1
b: 5

我正在寻找的结果如下:

a: 1
b: 1

a: 2
b: 2

a: 3
b: 3

a: 4
b: 4

a: 5
b: 5

问题答案:

问题

嗯,问题当然出在您嵌套的foreach循环上。因为对于$data1数组的每个元素,您都循环遍历整个$data2数组(所以总共有$data1*
$data2次迭代)。

解决方案

为了解决这个问题,您必须一次遍历两个数组。

array_map()方法(PHP> =

5.3)

您可以这样做array_map(),并将所有要循环通过的数组传递给它。

array_map(function($v1, $v2){
    echo $v1 . "<br>";
    echo $v2 . "<br><br>";
}, $data1, $data2 /* , Add more arrays if needed manually */);

注意: 如果元素数量不均匀,您将不会产生任何错误,它将仅打印NULL(意味着您将看不到任何东西)

MultipleIterator方法(PHP>= 5.3)

使用MultipleIterator和连接尽可能多的ArrayIterator,因为你需要。

$it = new MultipleIterator();
$it->attachIterator(new ArrayIterator($data1));
$it->attachIterator(new ArrayIterator($data2));
//Add more arrays if needed

foreach($it as $a) {
    echo $a[0] . "<br>";
    echo $a[1] . "<br><br>";
}

注意: 如果元素数量不均匀,它将仅在两个数组仍具有值的地方打印所有值

for loop方法(PHP> =

4.3)

使用带计数器变量的for循环,您可以将其用作两个数组的键。

$keysOne = array_keys($data1);
$keysTwo = array_keys($data2);

$min = min(count($data1), count($data2));

for($i = 0; $i < $min; $i++) {
    echo $data1[$keysOne[$i]] . "<br>";
    echo $data2[$keysTwo[$i]] . "<br><br>";
}

注意: 使用array_keys()只是这样,如果数组没有相同的键或没有关联,这也可以使用。min()用于仅遍历每个数组具有的尽可能多的元素

array_combine()方法(PHP> = 5.0)

或者,如果数组仅具有唯一值,则可以array_combine()同时使用两个数组,以便$data1可以将其作为键和$data2值进行访问。

foreach(array_combine($data1, $data2) as $d1 => $d2) {
    echo $d1 . "<br>";
    echo $d2 . "<br><br>";
}

注意: 数组必须具有相同数量的元素,否则array_combine()将引发错误

call_user_func_array()方法(PHP> = 5.6)

如果要同时打印两个以上的数组或仅打印未知数量的数组,可以将array_map()方法与call_user_func_array()调用结合使用。

$func = function(...$numbers){
    foreach($numbers as $v)
        echo $v . "<br>";
    echo "<br>";
};
call_user_func_array("array_map", [$func, $data1, $data2]);

注意: 由于这种array_map()方法使用该方法,因此在元素数量不均匀的情况下其行为相同。另外,由于此方法仅适用于PHP> =
5.6,因此您只需删除参数并在foreach循环中$numbers使用withfunc_get_args()进行更改,然后它也适用于PHP> = 5.3



 类似资料:
  • 问题内容: 说我有一个数组。如何一次迭代两个? 问题答案: 您可以使用称为stride(to :, by :)的进度循环,每n个元素对元素进行一次迭代: Xcode 8.3.2•Swift 3.1

  • 问题内容: 我有两个数组列表,声明为: 这两个字段都完全包含“值的相同”,实际上在自然界中是对应的。 我知道我可以遍历这样的循环之一: 但是,我想同时遍历两个列表。我知道它们的尺寸完全相同。我怎么做? 问题答案: 您可以使用:

  • 问题内容: 当前在React中,我正在使用一个数组进行迭代。但是,如何使用map同时遍历两个数组? 编辑 像这样,我希望在每次迭代之前都添加图标。我计划将这些图标放在另一个数组中。因此,这就是为什么要迭代两个数组的原因。 问题答案: 如果可能的话,我建议将文本与图像一起存储在对象数组中,例如: 这样,您就可以遍历数组并同时选择两个成员,例如: 如果这不可能,则只需映射一个数组并通过当前索引访问第二

  • 问题内容: 有没有那么冗长的替代方案: 我想出了这个: 这节省了一个缩进,但仍然很丑陋。 我希望看起来像这样的伪代码: 有没有类似的东西存在? 问题答案: 我认为您正在寻找ndenumerate。 关于性能。它比列表理解要慢一些。 如果您担心性能,可以通过查看实现来进一步优化,该实现有两件事,转换为数组并循环。如果知道有数组,则可以调用平面迭代器的属性。

  • 问题内容: 我有两个列表和数字,我想使用相同的指令遍历它们。像这样: 但这感觉多余。我知道我会写,但是要付出一定的时间。 有没有办法做到这一点而又不浪费时间呢? 问题答案: 这可以通过以下方式完成 : 将打印: 根据文档,请执行以下操作: 创建一个迭代器,该迭代器从第一个可迭代对象返回元素,直到耗尽为止,然后继续进行下一个可迭代对象,直到所有可迭代对象都耗尽为止。 如果列表中有列表, 则可用: 产

  • 问题内容: 在Python中有两个可迭代的对象,我想成对地讨论它们: 导致: 一种方法是遍历索引: 问题答案: Python 3 当或的较短者停止时,停止。 在Python 3 中,像在Python2中一样,返回元组的迭代器。要获取元组列表,请使用。要压缩直到两个迭代器都用尽,可以使用 。 Python 2 在Python 2中, 返回一个元组列表。当且不是很大时,这很好。如果它们都是大量的,则形