Php 如何使用整数数组重新映射数组键?

Php 如何使用整数数组重新映射数组键?,php,laravel,Php,Laravel,这是我的原始项目数组 $items=[ 0=>“项目1”, 1=>“第2项”, 2=>“第3项” ]; 我想根据项目的键更改项目的顺序,所以我正在这样做 $reorder=[2,0,1]; uksort($items,function($key1,$key2)use($reorder){ 返回(数组搜索($key1,$reorder)>数组搜索($key2,$reorder)); }); 这是它应该发挥的作用,并产生适当的结果 $items=[ 2=>“第3项”, 0=>“项目1”, 1=>

这是我的原始项目数组

$items=[
0=>“项目1”,
1=>“第2项”,
2=>“第3项”
];
我想根据项目的键更改项目的顺序,所以我正在这样做

$reorder=[2,0,1];
uksort($items,function($key1,$key2)use($reorder){
返回(数组搜索($key1,$reorder)>数组搜索($key2,$reorder));
});
这是它应该发挥的作用,并产生适当的结果

$items=[
2=>“第3项”,
0=>“项目1”,
1=>“第2项”
];
然而,当在Laravel中将其作为json返回时,新订购的
$items
会恢复到原始顺序,这显然不是我想要的


有没有办法在重新排列数组键的同时重新映射它们?

您如何在Laravel中返回数组?下面的示例完全符合您的要求

Route::get('/test', function () {
    $items = [
        0 => 'item 1',
        1 => 'item 2',
        2 => 'item 3'
    ];

    $reorder = [2,0,1];
    uksort($items, function($key1, $key2) use ($reorder) {
        return (array_search($key1, $reorder) > array_search($key2, $reorder));
    });

    return response()->json($items);
    // {"2":"item 3","0":"item 1","1":"item 2"}
});

如果您在浏览器中尝试过,请记住,某些浏览器会自动重新排序json数组。在这种情况下,您必须获取原始数据,而不是格式化数据。

在Laravel中返回数组的确切方式是什么?下面的示例完全符合您的要求

Route::get('/test', function () {
    $items = [
        0 => 'item 1',
        1 => 'item 2',
        2 => 'item 3'
    ];

    $reorder = [2,0,1];
    uksort($items, function($key1, $key2) use ($reorder) {
        return (array_search($key1, $reorder) > array_search($key2, $reorder));
    });

    return response()->json($items);
    // {"2":"item 3","0":"item 1","1":"item 2"}
});

如果您在浏览器中尝试过,请记住,某些浏览器会自动重新排序json数组。在这种情况下,您必须获取原始数据,而不是格式化数据。

我正在邮递员中进行测试。您的示例将起作用,因为您在创建阵列后没有对其重新排序。我正在获取一个集合并对其重新排序,如果我
dd()
it,这会很好,但是在通过
response()->json()
传递之后,它又回到了原始顺序。我在帖子中编辑了这个示例。数组键的顺序对我来说仍然正确。你真的确定你的浏览器没有自动格式化json数据吗?是的,你的示例可以,但是我的示例是我实际操作的简化版本,这就是为什么我想重新映射密钥。我正在Postman中测试。您的示例将起作用,因为您在创建阵列后没有对其重新排序。我正在获取一个集合并对其重新排序,如果我
dd()
it,这会很好,但是在通过
response()->json()
传递之后,它又回到了原始顺序。我在帖子中编辑了这个示例。数组键的顺序对我来说仍然正确。你真的确定你的浏览器没有自动格式化json数据吗?是的,你的例子是有效的,但是我的例子是我实际正在做的事情的简化版本,这就是为什么我想重新映射键。不是回答“在重新排序时重新映射数组键的方法”,而是回答
array\u values()
返回数组中的所有值,并对数组进行数字索引。因此您可以
returnresponse()->json(数组_值($items))@porloscerrosψ,它实际上解决了我的问题,如果我无法重新映射它们,它将起作用。谢谢@Porloscerosψ我可能说得太早了。这引入了一个以前没有的数组键。在API中返回时,它以前是
“items”:[{“id”:1,“name”:“Item One”}
现在是
“items”:{“8”:{“id”:9,“name”:“Item Nine”},
这可能会在API调用的接收端关闭应用程序。好吧,我不知道用你在问题中提供的信息告诉你什么。我读了Furkan回复中的评论,你说“我正在收集并重新排序”。因此,如果您使用的是集合,那么使用for collections可能会更容易。例如,
->values()
将为您提供类似于PHP的
array\u values()
的结果。您可以尝试
response()->json(collect($items)->values();
我实际上使用
array\u values()将其排序出来
按照
$items=array\u values($items)
return response()->json($items)
执行操作,保留了新顺序并删除了新键。再次感谢!不要回答“在重新排序时重新映射数组键的方法”,而是回答
array\u values()
返回数组中的所有值并对数组进行数字索引。因此,您可以
return response()->json(数组值($items))
@porloscerrosψ实际上解决了我的问题,如果我不能重新映射它们,它会起作用。谢谢!@porloscerrosψ我可能说得太快了。这在以前没有的地方引入了一个数组键。当返回API时,它过去是
“items”:[{“id”:1,“name”:“Item one”,“}
现在是
“items”:{“8”:{“id”:9,“name”:“Item Nine”,},
,这可能会在API调用的接收端中断应用程序。好吧,我不知道你在问题中提供的信息应该告诉你什么。我阅读了Furkan回复中的评论,其中你说“我正在收集并重新排序”。因此,如果您使用的是集合,那么使用for collections可能会更容易。例如,
->values()
将为您提供类似于PHP的
array\u values()
的结果。您可以尝试
response()->json(collect($items)->values();
我实际上使用
array\u values()将其排序出来
按照
$items=array\u values($items)
return response()->json($items)
执行操作,保留了新顺序并删除了新键。再次感谢!