来自FP背景,现在正在学习PHP,我很自然地失去了一些受人喜爱的高阶函数。我想知道在PHP中是否有类似于Clojure的partition-by的东西。以下是它所做工作的官方描述:
(partition-by f)(partition-by f coll)
将f函数应用于coll中的每个值,每次f返回新值时将其拆分。返回一个延迟的分区集合。当未提供集合时,返回有状态转换器。
我并不真正关心懒惰和换能器部分(我想这在PHP中是不可能的,对吗?)我需要做的是像这样转换一个数组:
[["year" => 2019, "val" => "foo"],
["year" => 2019, "val" => "bar"],
["year" => 2020, "val" => "baz"],
["year" => 2020, "val" => "boo)"]]这方面:
[[["year" => 2019, "val" => "foo"],
["year" => 2019, "val" => "bar"]],
[["year" => 2020, "val" => "baz"],
["year" => 2020, "val" => "boo)"]]]也就是说,我想根据这样一个函数的结果对它们进行分组:
function getYear($pair)
{
return $pair["year"];
}我还没有尝试自己编写类似的代码,但我想知道函数库(甚至内核)中是否存在这样的代码呢?PHP的。
发布于 2019-12-09 10:08:32
这并不是作为语言特性存在的。但是,也有一些现成的类也这样做。示例:
$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);输出:
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"
}
}
}发布于 2019-12-05 10:18:17
我不认为这是作为语言特征存在的。至少我没有或者找不到任何东西。
但是,(除非我误解了),这应该会给出您所描述的结果,但请注意,必须首先按照分区值对初始数组进行排序:
$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;
}https://stackoverflow.com/questions/59191930
复制相似问题