在 Laravel 集合上混合一个数组
Mix an array on Laravel Collection
我有一个类似于下面代码的数组:
$arr = ["a", "b", "c", 1, 2, 3, 4, 5, 6];
并且我使用 Laravel 集合作为这个数组,所以代码如下所示:
$collect = collect($arr);
我尝试使用以下代码,但仍然给出相同的数组:
$return_arr = [];
$return_arr = $collect->each(function($item) {
if(!empty($return_arr)) {
if(gettype($item) == gettype($newArr[count($newArr) - 1]) )
{
return false;
} else {
return $item;
}
} else {
return $item;
}
});
而且,我试过像下面的代码那样使用手动 foreach 循环,但它不是 return 所有元素:
$return_arr = [];
foreach ($arr as $item) {
if(!empty($return_arr)) {
if(gettype($return_arr[count($return_arr) - 1]) == gettype($item)) {
continue;
} else {
$return_arr[] = array_push($return_arr, $item);
}
} else {
$return_arr[]= array_push($return_arr, $item);
}
}
print_r($return_arr);
// return Array ( [0] => a [1] => 1 [2] => b [3] => 3 [4] => c [5] => 5 )
我想要的是 return 具有数组值的新集合如下所示:
$return_arr = ["a", 1, "b", 2, "c", 3, 4, 5, 6];
你们能帮帮我吗
提前致谢
如果您正在寻找一种将集合内容洗牌成随机集合的方法,请尝试 shuffle()
方法,如下所示:
$arr = ["a", "b", "c", 1, 2, 3, 4, 5, 6];
$collection = collect($arr);
$shuffled = $collection->shuffle();
$mixed_array = $shuffled->all();
这将为您提供以下输出:
=> ["b",4,5"c",2,3,"a",1,6,]
它很脏,但你可以试试:
use Illuminate\Support\Arr;
$array = ["a", "b", "c", 1, 2];
//split strings and integers
$string = Arr::where($array, function ($value, $key) {
return is_string($value);
});
$integer = Arr::where($array, function ($value, $key) {
return is_int($value);
});
$integer = array_values($integer);
$combine = [];
foreach (array_values($string) as $key => $value) {
$combine[] = $value;
if(array_key_exists($key, $integer)){
$combine[] = $integer[$key];
unset($integer[$key]);
}
}
$combine = array_merge($combine, $integer);
//["a", 1, "b", 2, "c"]
如果您尝试根据项目的类型交错放置项目,您可以尝试:
$collection = collect($array)->groupBy(function ($value) {
return gettype($value);
});
$interleaved = $collection->first()->zip($collection->last())->flatten()->filter();
这将:
- 按类型对项目进行分组
- 取第一组并将其与最后一组压缩(假设您正好有 2 组)
- 然后它将结果展平并过滤掉空值
注意:您可能需要添加检查以确定字符串组是第一个还是最后一个并相应地进行调整。
我有一个类似于下面代码的数组:
$arr = ["a", "b", "c", 1, 2, 3, 4, 5, 6];
并且我使用 Laravel 集合作为这个数组,所以代码如下所示:
$collect = collect($arr);
我尝试使用以下代码,但仍然给出相同的数组:
$return_arr = [];
$return_arr = $collect->each(function($item) {
if(!empty($return_arr)) {
if(gettype($item) == gettype($newArr[count($newArr) - 1]) )
{
return false;
} else {
return $item;
}
} else {
return $item;
}
});
而且,我试过像下面的代码那样使用手动 foreach 循环,但它不是 return 所有元素:
$return_arr = [];
foreach ($arr as $item) {
if(!empty($return_arr)) {
if(gettype($return_arr[count($return_arr) - 1]) == gettype($item)) {
continue;
} else {
$return_arr[] = array_push($return_arr, $item);
}
} else {
$return_arr[]= array_push($return_arr, $item);
}
}
print_r($return_arr);
// return Array ( [0] => a [1] => 1 [2] => b [3] => 3 [4] => c [5] => 5 )
我想要的是 return 具有数组值的新集合如下所示:
$return_arr = ["a", 1, "b", 2, "c", 3, 4, 5, 6];
你们能帮帮我吗
提前致谢
如果您正在寻找一种将集合内容洗牌成随机集合的方法,请尝试 shuffle()
方法,如下所示:
$arr = ["a", "b", "c", 1, 2, 3, 4, 5, 6];
$collection = collect($arr);
$shuffled = $collection->shuffle();
$mixed_array = $shuffled->all();
这将为您提供以下输出:
=> ["b",4,5"c",2,3,"a",1,6,]
它很脏,但你可以试试:
use Illuminate\Support\Arr;
$array = ["a", "b", "c", 1, 2];
//split strings and integers
$string = Arr::where($array, function ($value, $key) {
return is_string($value);
});
$integer = Arr::where($array, function ($value, $key) {
return is_int($value);
});
$integer = array_values($integer);
$combine = [];
foreach (array_values($string) as $key => $value) {
$combine[] = $value;
if(array_key_exists($key, $integer)){
$combine[] = $integer[$key];
unset($integer[$key]);
}
}
$combine = array_merge($combine, $integer);
//["a", 1, "b", 2, "c"]
如果您尝试根据项目的类型交错放置项目,您可以尝试:
$collection = collect($array)->groupBy(function ($value) {
return gettype($value);
});
$interleaved = $collection->first()->zip($collection->last())->flatten()->filter();
这将:
- 按类型对项目进行分组
- 取第一组并将其与最后一组压缩(假设您正好有 2 组)
- 然后它将结果展平并过滤掉空值
注意:您可能需要添加检查以确定字符串组是第一个还是最后一个并相应地进行调整。