调用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
相关产品推荐
相关产品推荐

