You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

调用array_filter()后数组索引格式异常问题咨询

问题原因分析

这事儿其实是array_filter()的核心特性导致的:它会完整保留原数组中元素的原始键名,不会自动重新索引数组。

具体到你的场景:

  • 当过滤后匹配到的元素是原$products->data数组里的第一个元素(原始键为0),返回的数组看起来就是标准的索引数组——毕竟0是索引数组的默认起始键,和我们平时看到的索引数组形式一致。
  • 当匹配到的元素在原数组里的原始键不是0(比如是1、2这类非起始数字键),这些键会被原封不动保留下来,所以返回的数组就会变成带非连续数字键的关联数组形式,也就是你看到的{1: {...}}这种样子。

举个直观的例子帮你理解:
假设原$products->data数组是这样的:

[
    0 => (object) ['id' => 'USD_SNAP', ...],
    1 => (object) ['id' => 'GBP_SNAP', ...],
    2 => (object) ['id' => 'JPY_SNAP', ...],
]
  • 当你过滤JPY时,匹配到的是键为2的元素,array_filter返回的数组就是[2 => (object) ['id' => 'JPY_SNAP', ...]];但如果JPY_SNAP刚好在原数组的键0位置,返回的就是[0 => ...],看起来和普通索引数组没区别。
快速解决办法

如果你希望过滤后的数组始终是连续索引的标准数组,只需要在array_filter之后用array_values()重新索引一遍就行:

$filtered = array_filter($products->data, function ($item) use ($request) {
    return strpos($item->id, strtoupper($request->currency)) !== false;
});
// 重新索引,得到从0开始的连续索引数组
$filtered = array_values($filtered);
return $filtered;

这样不管匹配到原数组里哪个位置的元素,返回的都会是我们习惯的连续索引数组格式啦。

内容的提问来源于stack exchange,提问作者Luke Brandon Farrell

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 08:42:05