循环遍历不同大小的数组 - 避免'Undefined offset'错误



我正在研究一个基本的系统来生成随机单词组合。

我运行一点 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:xampppublic_htmltest.php on line 224

其中第 224 行是这一行:

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

我一直在尝试通过计算数组的大小来解决这个问题 - 例如 - 如果list2包含的元素比list1少,那么只循环遍历list1list2中的元素一样多的次数。

我正在尝试笨拙的解决方案,例如:

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

但是,这并不能解决问题。

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

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

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

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

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

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

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

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

尝试:

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

相关内容

最新更新