PHP多维数组中如何比较当前与前一个元素的qty值?
解决PHP多维数组相邻元素qty对比的问题
嘿,我看你在处理多维数组里相邻元素的qty对比时遇到了点小困扰,之前用current()、next()、prev()没得到预期结果,咱先捋捋问题出在哪,再给你靠谱的解决方案~
先说说你之前代码的问题
你用的current()、prev()这些函数是用来操作单个一维数组的内部指针的,比如遍历一个像[1,2,3]这样的数组时移动指针,但你的场景里,$myArray[0]['qty']是单个数值(比如15),不是数组,所以用这些函数完全不对头,这就是为啥没得到预期结果的原因。
再具体看你的两段代码:
- 第一段for循环里,你根本没用到循环变量
$i,每次都在取第一个元素的qty,完全没遍历数组里的其他元素,逻辑就错了。 - 第二段foreach里,
prev($item['qty'] > 5)不仅语法错误,而且同样把单个数值当成数组来操作,肯定行不通。
正确的解决方案
其实不用搞复杂的数组指针操作,直接遍历数组,记录前一个元素的信息就行,简单又直观。
方案一:用for循环通过索引对比
这种方式适合知道数组是索引数组的情况,直接通过索引访问前一个元素:
// 你的样本数组 $myArray = [ ['name' => 'foo', 'qty' => 15], ['name' => 'bar', 'qty' => 0], ['name' => 'baz', 'qty' => 47] ]; $arrayLength = count($myArray); // 从第二个元素开始遍历(索引1),因为第一个元素没有前一个 for ($i = 1; $i < $arrayLength; $i++) { $currentItem = $myArray[$i]; $prevItem = $myArray[$i - 1]; // 判断条件:当前qty为0,且前一个qty大于5 if ($currentItem['qty'] === 0 && $prevItem['qty'] > 5) { // 生成你需要的邮件内容 $emailContent = "**{$currentItem['name']}** is empty, check **{$prevItem['name']}** for replenishment!"; echo $emailContent; // 如果有多个符合条件的情况,可以去掉下面的break,这里样本只有一个符合的 // break; } }
方案二:用foreach记录前一个元素
如果数组不是严格的索引数组,用foreach更灵活,只需要在循环里记录上一个元素就行:
// 你的样本数组 $myArray = [ ['name' => 'foo', 'qty' => 15], ['name' => 'bar', 'qty' => 0], ['name' => 'baz', 'qty' => 47] ]; $prevItem = null; // 初始化前一个元素为null foreach ($myArray as $currentItem) { // 跳过第一个元素,因为没有前一个可以对比 if ($prevItem !== null) { if ($currentItem['qty'] === 0 && $prevItem['qty'] > 5) { $emailContent = "**{$currentItem['name']}** is empty, check **{$prevItem['name']}** for replenishment!"; echo $emailContent; } } // 更新前一个元素为当前元素,供下一次循环使用 $prevItem = $currentItem; }
总结一下
current()、next()、prev()这类函数适合操作单个一维数组的指针,你的场景是多维数组的相邻元素对比,直接通过索引或者记录前一个元素的方式更简单,也不容易出错。上面两种方案都能生成你期望的邮件内容,选哪种看你数组的结构和个人习惯就行~
内容的提问来源于stack exchange,提问作者mezzomix
相关产品推荐
相关产品推荐

