<?php
$names = ['Alice', 'Bob', 'Charlie', 'Alice', 'Dave', 'Alice'];
class Name {
public $name;
public $id;
public function __construct($name, $id = 0) {
$this->name = $name;
$this->id = $id;
}
}
function is_similar($a, $b) {
return $a->name == $b->name;
}
function contains(array $list, $item, callable $comparitor) {
foreach ($list as $test) {
if ($comparitor) {
return true;
}
}
return false;
}
function partial($func, $arg1) {
$func_args = func_get_args();
$args = array_slice($func_args, 1);
return function() use($func, $args) {
$full_args = array_merge($args, func_get_args());
return call_user_func_array($func, $full_args);
};
}
// Transform strings -> objects
$mappedNames = array_map(function($name) { return new Name($name); }, $names);
// Deduplicate list
$reduction = function(callable $comparitor, array $carry, $item) {
if (contains($carry, $item, $comparitor)) {
return $carry;
}
return array_merge($carry, array($item));
};
$reducedNames = array_reduce($mappedNames, partial($reduction, "is_similar"), []);
$idNames = array_map(function($item, $id) {
return new Name($item->name, $id);
}, $reducedNames, range(1, count($reducedNames)));
var_dump($idNames);
preferences:
38.08 ms | 402 KiB | 5 Q