循环遍历大小不同的数组-避免出现“未定义偏移”错误

时间:2018-09-22 10:57:22

标签: php

我正在一个基本系统上生成随机单词组合。

我运行一点SQL并获得一个带有结果的数组,然后运行SQL另一点以获取带有不同单词集的第二个数组。

我遍历第一个数组,然后将第一个数组中的第一个单词与第二个数组中的相应单词连接起来。

因此,假设我有以下两个数组:

Array // referred to as `$list1

(
    [0] => yttrium
    [1] => yafty
    [2] => yard
    [3] => yellowknife
    [4] => yeasty
    [5] => york
    [6] => yo
    [7] => yemeles
    [8] => yo
    [9] => yellowstone
)

Array // referred to as `$list2

(
    [0] => yudding
    [1] => yudge
    [2] => yoody
    [3] => yeer
    [4] => yoisy
    [5] => yafty
    [6] => yine
    [7] => yuity
    [8] => yio
)

我循环使用以下基本代码:

foreach ($list1 as $k => $v) {

    $words['output'][] = [
        'id' => $k,
        'value' => $v . '.' . $list2[$k]
    ];
}

看着上面的示例数组,我遇到的问题是,与list1中的元素相比,list2中的元素更多,因为出现此错误:

Undefined offset: 9 in C:\xampp\public_html\test.php on line 224

这是第224行:

'value' => $v . '.' . $list2[$k]

我一直在尝试解决该问题的方法-例如,通过计算数组的大小,并且如果list2包含的元素少于list1,则仅循环遍历{{1 }}是list1中元素的数量。

我正在尝试像这样的笨拙的解决方案:

list2

但是,这不能解决问题。

3 个答案:

答案 0 :(得分:0)

您可以使用isset()测试数组元素是否存在。

'value' => $v . '.' . (isset($list2[$k]) ? $list2[$k] : "")

您的代码不起作用,因为您实际上没有使用设置的$k的值。您只是用$list1的键覆盖它。编写第二个循环的正确方法是:

foreach (array_slice($list1, 0, $k) as $key => $value) {
    ...
}

顺便说一句,有一个内置函数可查找较小的数字:$k = min($s1, $s2);

答案 1 :(得分:0)

您可以尝试仅添加第二个数组中的元素(如果存在)

foreach ($list1 as $k => $v) {
    $value = $v;
    if (isset($list2[$k]) {
        $value .= '.' . $list2[$k];
    }
    $words['output'][] = [
        'id' => $k,
        'value' => $value
    ];
}

答案 2 :(得分:0)

也许使用array_key_exists(value, array);来确定密钥是否在循环中的两个数组中都存在

尝试:

if(array_key_exists($k, $list2)){
    Do something if exists
}else{
    If doesn’t exist do something 
}