首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在PHP中Clojure的分区?

在PHP中Clojure的分区?
EN

Stack Overflow用户
提问于 2019-12-05 09:27:50
回答 2查看 181关注 0票数 4

来自FP背景,现在正在学习PHP,我很自然地失去了一些受人喜爱的高阶函数。我想知道在PHP中是否有类似于Clojure的partition-by的东西。以下是它所做工作的官方描述:

(partition-by f)(partition-by f coll)

f函数应用于coll中的每个值,每次f返回新值时将其拆分。返回一个延迟的分区集合。当未提供集合时,返回有状态转换器。

我并不真正关心懒惰和换能器部分(我想这在PHP中是不可能的,对吗?)我需要做的是像这样转换一个数组:

代码语言:javascript
复制
[["year" => 2019, "val" => "foo"],
 ["year" => 2019, "val" => "bar"],
 ["year" => 2020, "val" => "baz"],
 ["year" => 2020, "val" => "boo)"]]

这方面:

代码语言:javascript
复制
[[["year" => 2019, "val" => "foo"],
  ["year" => 2019, "val" => "bar"]],
 [["year" => 2020, "val" => "baz"],
  ["year" => 2020, "val" => "boo)"]]]

也就是说,我想根据这样一个函数的结果对它们进行分组:

代码语言:javascript
复制
function getYear($pair)
{
    return $pair["year"];
}

我还没有尝试自己编写类似的代码,但我想知道函数库(甚至内核)中是否存在这样的代码呢?PHP的。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-12-09 10:08:32

这并不是作为语言特性存在的。但是,也有一些现成的类也这样做。示例:

代码语言:javascript
复制
$f = [
 ["year" => 2020, "val" => "baz"],
 ["year" => 2019, "val" => "foo"],
 ["year" => 2019, "val" => "bar"],
 ["year" => 2020, "val" => "boo)"]
];

//https://github.com/jspit-de/tableArray
$newArr = tableArray::create($f)
  ->orderBy('year ASC,val ASC')
  ->fetchGroup(['year'])
;

//test output
echo '<pre>';
var_dump($newArr);

输出:

代码语言:javascript
复制
array(2) {
  [2019]=>
  array(2) {
    [0]=>
    array(2) {
      ["year"]=>
      int(2019)
      ["val"]=>
      string(3) "foo"
    }
    [1]=>
    array(2) {
      ["year"]=>
      int(2019)
      ["val"]=>
      string(3) "bar"
    }
  }
  [2020]=>
  array(2) {
    [2]=>
    array(2) {
      ["year"]=>
      int(2020)
      ["val"]=>
      string(4) "boo)"
    }
    [3]=>
    array(2) {
      ["year"]=>
      int(2020)
      ["val"]=>
      string(3) "baz"
    }
  }
}
票数 0
EN

Stack Overflow用户

发布于 2019-12-05 10:18:17

我不认为这是作为语言特征存在的。至少我没有或者找不到任何东西。

但是,(除非我误解了),这应该会给出您所描述的结果,但请注意,必须首先按照分区值对初始数组进行排序:

代码语言:javascript
复制
$f = [
 ["year" => 2019, "val" => "foo"],
 ["year" => 2019, "val" => "bar"],
 ["year" => 2020, "val" => "baz"],
 ["year" => 2020, "val" => "boo)"]
];

var_dump(partitionMultidim($f, "year"));

function partitionMultidim(array $values, string $key):array{
    $new = [];
    $p = $values[0][$key]; // alternatively check if exists in loop and set if not
    $partitionNum = 0;
    foreach($values as $value){
        // what is the current value?
        $curPartitionVal = $value[$key]; // or getYear($b);
        // has the value changed?
        if ( $p !== $curPartitionVal ){
            // set the next partition value
            $p = $curPartitionVal;
            // new partition index
            $partitionNum++;
        }
        // add to the new array
        $new[$partitionNum][] = $value;
    }   
    return $new;
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59191930

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档