如何设置数组中各sendby值最后出现项的last字段为1?
嘿,这个需求我之前也碰到过,给你分享两种靠谱的PHP实现方式,按需选就行~
方法一:逆向遍历标记法
这个思路特别直观,从数组末尾往前找,遇到的第一个某sendby值就是它最后出现的实例,直接标记,后面再碰到同sendby的就设为0:
- 先建一个空数组用来记录已经处理过的
sendbyID - 从数组最后一位开始倒序遍历
- 每遇到一个元素:
- 如果这个
sendby还没被记录过,就把它的last设为1,同时把sendby加入记录数组 - 如果已经记录过,就把
last设为0
- 如果这个
- 最后把处理后的数组反转回原顺序(因为我们是倒着遍历的)
代码示例:
$originalArray = [ ['sendby' => 3, 'refresh' => 0, 'last' => 0], ['sendby' => 3, 'refresh' => 1, 'last' => 1], ['sendby' => 8, 'refresh' => 1, 'last' => 1], ]; $processed = []; $seenSendbys = []; // 从数组末尾开始倒序遍历 for ($i = count($originalArray) - 1; $i >= 0; $i--) { $item = $originalArray[$i]; if (!in_array($item['sendby'], $seenSendbys)) { $item['last'] = 1; $seenSendbys[] = $item['sendby']; } else { $item['last'] = 0; } // 把处理后的元素放到结果数组开头,保持原顺序 array_unshift($processed, $item); } // 输出结果 print_r($processed);
这个方法的好处是逻辑简单,新手也能快速理解,适合数组规模不大的场景。
方法二:先统计最后位置,再批量设置
如果你的数组比较大,这个方法效率会更高——先一次性统计每个sendby最后出现的下标,再遍历数组对比设置:
- 第一次遍历数组,用一个关联数组记录每个
sendby对应的最后出现下标(后面的下标会覆盖前面的,最后存的就是最末尾的位置) - 第二次遍历数组,判断当前元素的下标是不是该
sendby的最后下标,是就设last=1,否则设为0
代码示例:
$originalArray = [ ['sendby' => 3, 'refresh' => 0, 'last' => 0], ['sendby' => 3, 'refresh' => 1, 'last' => 1], ['sendby' => 8, 'refresh' => 1, 'last' => 1], ]; // 第一步:统计每个sendby最后出现的下标 $lastIndices = []; foreach ($originalArray as $index => $item) { $lastIndices[$item['sendby']] = $index; } // 第二步:遍历数组设置last字段(用引用直接修改原数组) foreach ($originalArray as $index => &$item) { $item['last'] = ($index === $lastIndices[$item['sendby']]) ? 1 : 0; } unset($item); // 解除引用,避免后续操作污染数组 // 输出结果 print_r($originalArray);
这个方法只需要两次线性遍历,比方法一的array_unshift(每次操作都是O(n)复杂度)要高效得多,适合处理大数组。
小提示
- 如果数组里的元素是对象,只需要把
$item['sendby']改成$item->sendby这种属性访问方式就行 - 不管
sendby是数字还是字符串,这两种方法都能正常工作
内容的提问来源于stack exchange,提问作者Lokiyou
相关产品推荐
相关产品推荐

