Skip to content

Instantly share code, notes, and snippets.

@smailliwcs
Created September 22, 2020 15:24
Show Gist options
  • Save smailliwcs/63d5a87ebbe73a2e231d4e21613fc957 to your computer and use it in GitHub Desktop.
Save smailliwcs/63d5a87ebbe73a2e231d4e21613fc957 to your computer and use it in GitHub Desktop.
Underscore.php mixin: multisort
<?php
__()->mixin([
"reindex" => function ($items, $indices) {
return __($indices)->map(function ($index) use ($items) { return $items[$index]; });
},
"multisort" => function ($items, $keys) {
if (count($items) <= 1) {
return $items;
}
$__items = __($items);
$args = [];
foreach ($keys as $key) {
if (!is_array($key)) {
$key = [$key];
}
$property = array_shift($key);
$args[] = $__items->pluck($property);
$args = array_merge($args, $key);
}
$indices = __()->range($__items->size());
$args[] = &$indices;
call_user_func_array("array_multisort", $args);
return $__items->reindex($indices);
}
]);
function format($president) {
return sprintf(
"%d: %s %s (%s)",
$president["order"],
$president["firstName"],
$president["lastName"],
$president["party"]);
}
function display($presidents) {
print_r(__($presidents)->invoke("format"));
}
$presidents = __([
["order" => 1, "firstName" => "George", "lastName" => "Washington", "party" => "None"],
["order" => 2, "firstName" => "John", "lastName" => "Adams", "party" => "Federalist"],
["order" => 3, "firstName" => "Thomas", "lastName" => "Jefferson", "party" => "Democratic-Republican"],
["order" => 4, "firstName" => "James", "lastName" => "Madison", "party" => "Democratic-Republican"],
["order" => 5, "firstName" => "James", "lastName" => "Monroe", "party" => "Democratic-Republican"],
["order" => 6, "firstName" => "John Quincy", "lastName" => "Adams", "party" => "Democratic-Republican"],
["order" => 7, "firstName" => "Andrew", "lastName" => "Jackson", "party" => "Democratic"],
["order" => 8, "firstName" => "Martin", "lastName" => "Van Buren", "party" => "Democratic"],
["order" => 9, "firstName" => "William Henry", "lastName" => "Harrison", "party" => "Whig"],
["order" => 10, "firstName" => "John", "lastName" => "Tyler", "party" => "Whig"]
]);
display($presidents->multisort(["firstName"]));
display($presidents->multisort([["lastName", SORT_DESC]]));
display($presidents->multisort(["party", ["order", SORT_DESC]]));
?>
Array
(
[0] => 7: Andrew Jackson (Democratic)
[1] => 1: George Washington (None)
[2] => 4: James Madison (Democratic-Republican)
[3] => 5: James Monroe (Democratic-Republican)
[4] => 2: John Adams (Federalist)
[5] => 10: John Tyler (Whig)
[6] => 6: John Quincy Adams (Democratic-Republican)
[7] => 8: Martin Van Buren (Democratic)
[8] => 3: Thomas Jefferson (Democratic-Republican)
[9] => 9: William Henry Harrison (Whig)
)
Array
(
[0] => 1: George Washington (None)
[1] => 8: Martin Van Buren (Democratic)
[2] => 10: John Tyler (Whig)
[3] => 5: James Monroe (Democratic-Republican)
[4] => 4: James Madison (Democratic-Republican)
[5] => 3: Thomas Jefferson (Democratic-Republican)
[6] => 7: Andrew Jackson (Democratic)
[7] => 9: William Henry Harrison (Whig)
[8] => 2: John Adams (Federalist)
[9] => 6: John Quincy Adams (Democratic-Republican)
)
Array
(
[0] => 8: Martin Van Buren (Democratic)
[1] => 7: Andrew Jackson (Democratic)
[2] => 6: John Quincy Adams (Democratic-Republican)
[3] => 5: James Monroe (Democratic-Republican)
[4] => 4: James Madison (Democratic-Republican)
[5] => 3: Thomas Jefferson (Democratic-Republican)
[6] => 2: John Adams (Federalist)
[7] => 1: George Washington (None)
[8] => 10: John Tyler (Whig)
[9] => 9: William Henry Harrison (Whig)
)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment