将 foreach 重构为函数式编程
Refactoring a foreach to functional programming
我正在将一些代码重构为函数式编程以提高可读性,但我遇到了数组问题。我想将对象数组更改为包含值数组的简单数组。
第一个数组如下所示:
array(2) {
[5701]=>
object(stdClass)#123 (3) {
["id"]=>
string(4) "5701"
["username"]=>
string(6) "s67688"
["state"]=>
string(6) "Inactive"
}
[5762]=>
object(stdClass)#136 (3) {
["id"]=>
string(4) "5762"
["username"]=>
string(6) "s67701"
["state"]=>
string(6) "Active"
}
}
我想把它转换成这样:
array(2) {
[0]=>
array(3) {
[0]=>
id(4) 5701
[1]=>
string(6) "s67688"
[2]=>
string(8) "Inactive"
}
[1]=>
array(3) {
[0]=>
int(4) 5762
[1]=>
string(6) "s67701"
[2]=>
string(8) "Active"
}
}
使用简单的 foreach 很容易实现,但是当我尝试以下代码时:
$newArr = array_map(function($value){
return array_values(get_object_vars($value));
}, $baseArr);
输出如下:
array(2) {
[5701]=>
array(3) {
[0]=>
id(4) 5701
[1]=>
string(6) "s67688"
[2]=>
string(8) "Inactive"
}
[5762]=>
array(3) {
[0]=>
int(4) 5762
[1]=>
string(6) "s67701"
[2]=>
string(8) "Active"
}
}
如您所见,基本数组键没有改变,为什么会这样?
这是原始的 foreach,returns 我想要的是:
$newArr = [];
foreach ($baseArr as $value) {
$newArr[] = array_values(get_object_vars($user));
}
我也试过了array_walk。
array_map
对值应用回调,但不修改键。我还通过转换为 array
:
简化了获取值的过程
$newArr = array_values(array_map(function($v){
return array_values((array)$v);
}, $baseArr));
您可以在上面的之后使用 array_values
,或者在:
之前
$newArr = array_map(function($v){
return array_values((array)$v);
}, array_values($baseArr));
我个人会将其保留为关联数组:
$newArr = array_values(array_map(function($v){ return (array)$v; }, $baseArr));
如果您可以使用库,那么可以使用 Tarsana Functional
轻松完成
use Tarsana\Functional as F;
$newArr = F\value(F\map(F\values(), $baseArr));
注意我是那个库的作者
我正在将一些代码重构为函数式编程以提高可读性,但我遇到了数组问题。我想将对象数组更改为包含值数组的简单数组。
第一个数组如下所示:
array(2) {
[5701]=>
object(stdClass)#123 (3) {
["id"]=>
string(4) "5701"
["username"]=>
string(6) "s67688"
["state"]=>
string(6) "Inactive"
}
[5762]=>
object(stdClass)#136 (3) {
["id"]=>
string(4) "5762"
["username"]=>
string(6) "s67701"
["state"]=>
string(6) "Active"
}
}
我想把它转换成这样:
array(2) {
[0]=>
array(3) {
[0]=>
id(4) 5701
[1]=>
string(6) "s67688"
[2]=>
string(8) "Inactive"
}
[1]=>
array(3) {
[0]=>
int(4) 5762
[1]=>
string(6) "s67701"
[2]=>
string(8) "Active"
}
}
使用简单的 foreach 很容易实现,但是当我尝试以下代码时:
$newArr = array_map(function($value){
return array_values(get_object_vars($value));
}, $baseArr);
输出如下:
array(2) {
[5701]=>
array(3) {
[0]=>
id(4) 5701
[1]=>
string(6) "s67688"
[2]=>
string(8) "Inactive"
}
[5762]=>
array(3) {
[0]=>
int(4) 5762
[1]=>
string(6) "s67701"
[2]=>
string(8) "Active"
}
}
如您所见,基本数组键没有改变,为什么会这样?
这是原始的 foreach,returns 我想要的是:
$newArr = [];
foreach ($baseArr as $value) {
$newArr[] = array_values(get_object_vars($user));
}
我也试过了array_walk。
array_map
对值应用回调,但不修改键。我还通过转换为 array
:
$newArr = array_values(array_map(function($v){
return array_values((array)$v);
}, $baseArr));
您可以在上面的之后使用 array_values
,或者在:
$newArr = array_map(function($v){
return array_values((array)$v);
}, array_values($baseArr));
我个人会将其保留为关联数组:
$newArr = array_values(array_map(function($v){ return (array)$v; }, $baseArr));
如果您可以使用库,那么可以使用 Tarsana Functional
轻松完成use Tarsana\Functional as F;
$newArr = F\value(F\map(F\values(), $baseArr));
注意我是那个库的作者