将 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));

注意我是那个库的作者