<?php
$data =[
"lut_avy_aspect" => ["description" => "Avalanche Obs Aspect List", "key" => "code", "label" => "label", "sortorder" => "listorder"],
"lut_boolean" => ["description" => "Boolean Data", "key" => "code", "label" => "label", "sortorder" => "listorder"],
"lut_avy_bedsurface" => ["description" => "Avalanche Bed Surface Type", "key" => "code", "label" => "code,label", "sortorder" => "listorder"],
"lut_avy_paths" => ["description" => "Avalanche Paths", "key" => "code", "label" => "label", "sortorder" => "listorder"],
"lut_avy_size_destructiveforce" => ["description" => "Avalanche Destructive Force", "key" => "code", "label" => "code,label", "sortorder" => "listorder"],
"lut_avy_size_relativetopath" => ["description" => "Avalanche Relative Path Size", "key" => "code", "label" => "label", "sortorder" => "listorder"],
"lut_avy_startzone_horiz" => ["description" => "Start Zone Horizontal Measure", "key" => "code", "label" => "code,label", "sortorder" => "listorder"],
"lut_avy_startzone_vert" => ["description" => "Start Zone Vertical Measure", "key" => "code", "label" => "code,label", "sortorder" => "listorder"],
"lut_avy_termdebris_detailed" => ["description" => "Avalanche Debris (Detailed)", "key" => "code", "label" => "code,label", "sortorder" => "listorder"],
"lut_avy_termdebris_long" => ["description" => "Long Avalanche Debris", "key" => "code", "label" => "code,label", "sortorder" => "listorder"],
"lut_avy_termdebris_short" => ["description" => "Short Avalanche Debris", "key" => "code", "label" => "code,label", "sortorder" => "listorder"],
"lut_avy_terminusmoisture" => ["description" => "Avalanche Terminus Moisture", "key" => "code", "label" => "label", "sortorder" => "listorder"],
"lut_avy_triggers" => ["description" => "Avalanche Trigger Types", "key" => "code", "label" => "code,label", "sortorder" => "code"],
"lut_avy_triggers_humanmod" => ["description" => "Human Modified Triggers", "key" => "code", "label" => "label", "sortorder" => "listorder"],
"lut_avy_trigtypes" => ["description" => "Avalanche Trigger Types", "key" => "code", "label" => "label", "sortorder" => "listorder"],
"lut_avy_types" => ["description" => "Avalanche Types", "key" => "code", "label" => "label", "sortorder" => "listorder"],
"lut_obs_observers" => ["description" => "Observer List", "key" => "observer_id", "label" => "obs_lname", "sortorder" => "observer_id"],
"lut_obs_seasons" => ["description" => "Observed Seasons", "key" => "season_id", "label" => "season_text", "sortorder" => "season_text"],
"lut_wx_airtemptrends" => ["description" => "Air Temperature Trends", "key" => "code", "label" => "label", "sortorder" => "listorder"],
"lut_wx_preciprate" => ["description" => "Precipitation Rates", "key" => "code", "label" => "label", "sortorder" => "listorder"],
"lut_wx_preciprate_rain" => ["description" => "Rain Precipitation Rate", "key" => "code", "label" => "label", "sortorder" => "listorder"],
"lut_wx_preciprate_snow" => ["description" => "Snow Precipitation Rate", "key" => "code", "label" => "label", "sortorder" => "listorder"],
"lut_wx_preciptype" => ["description" => "Precipitation Type", "key" => "code", "label" => "label", "sortorder" => "listorder"],
"lut_wx_pressuretrends" => ["description" => "Pressure Trends", "key" => "code", "label" => "label", "sortorder" => "listorder"],
"lut_wx_skyconditions" => ["description" => "Sky Conditions", "key" => "code", "label" => "label", "sortorder" => "listorder"],
"lut_wx_snow_ground" => ["description" => "Ground Snow Conditions", "key" => "code", "label" => "label", "sortorder" => "listorder"],
"lut_wx_snow_surface" => ["description" => "Surface Snow Conditions", "key" => "code", "label" => "label", "sortorder" => "listorder"],
"lut_wx_weatherlocations" => ["description" => "Weather Observation Locations", "key" => "code", "label" => "label", "sortorder" => "listorder"],
"lut_wx_wind_blowingridgetops" => ["description" => "Ridgetop Wind Blowing Conditions", "key" => "code", "label" => "label", "sortorder" => "listorder"],
"lut_wx_wind_snowdirection" => ["description" => "Snow Wind Direction", "key" => "code", "label" => "label", "sortorder" => "listorder"],
"lut_wx_wind_speedestimates" => ["description" => "Estimated Wind Speeds", "key" => "code", "label" => "label", "sortorder" => "listorder"]
];
usort($data, make_comparer
('description'));
function make_comparer() {
// Normalize criteria up front so that the comparer finds everything tidy
foreach ($criteria as $index => $criterion) {
$criteria[$index] = is_array($criterion) : array($criterion, SORT_ASC
, null); }
return function($first, $second) use ($criteria) {
foreach ($criteria as $criterion) {
// How will we compare this round?
list($column, $sortOrder, $projection) = $criterion; $sortOrder = $sortOrder === SORT_DESC ? -1 : 1;
// If a projection was defined project the values now
if ($projection) {
}
else {
$lhs = $first[$column];
$rhs = $second[$column];
}
// Do the actual comparison; do not return if equal
if ($lhs < $rhs) {
return -1 * $sortOrder;
}
else if ($lhs > $rhs) {
return 1 * $sortOrder;
}
}
return 0; // tiebreakers exhausted, so $first == $second
};
}
PD9waHAKCiRkYXRhID1bCgkJCSJsdXRfYXZ5X2FzcGVjdCIgPT4gCQkJCVsiZGVzY3JpcHRpb24iID0+ICJBdmFsYW5jaGUgT2JzIEFzcGVjdCBMaXN0IiwgCQkJImtleSIgPT4gImNvZGUiLAkJImxhYmVsIiA9PiAibGFiZWwiLAkJCSJzb3J0b3JkZXIiID0+ICJsaXN0b3JkZXIiXSwKCQkJImx1dF9ib29sZWFuIiA9PiAJCQkJCVsiZGVzY3JpcHRpb24iID0+ICJCb29sZWFuIERhdGEiLAkJCSAJCQkia2V5IiA9PiAiY29kZSIsCQkibGFiZWwiID0+ICJsYWJlbCIsCQkJInNvcnRvcmRlciIgPT4gImxpc3RvcmRlciJdLAoJCQkibHV0X2F2eV9iZWRzdXJmYWNlIiA9PiAJCQlbImRlc2NyaXB0aW9uIiA9PiAiQXZhbGFuY2hlIEJlZCBTdXJmYWNlIFR5cGUiLCAJCSJrZXkiID0+ICJjb2RlIiwJCSJsYWJlbCIgPT4gImNvZGUsbGFiZWwiLAkic29ydG9yZGVyIiA9PiAibGlzdG9yZGVyIl0sCgkJCSJsdXRfYXZ5X3BhdGhzIiA9PiAJCQkJCVsiZGVzY3JpcHRpb24iID0+ICJBdmFsYW5jaGUgUGF0aHMiLCAJCQkJCSJrZXkiID0+ICJjb2RlIiwJCSJsYWJlbCIgPT4gImxhYmVsIiwJCQkic29ydG9yZGVyIiA9PiAibGlzdG9yZGVyIl0sCgkJCSJsdXRfYXZ5X3NpemVfZGVzdHJ1Y3RpdmVmb3JjZSIgPT4gCVsiZGVzY3JpcHRpb24iID0+ICJBdmFsYW5jaGUgRGVzdHJ1Y3RpdmUgRm9yY2UiLCAJCSJrZXkiID0+ICJjb2RlIiwJCSJsYWJlbCIgPT4gImNvZGUsbGFiZWwiLAkic29ydG9yZGVyIiA9PiAibGlzdG9yZGVyIl0sCgkJCSJsdXRfYXZ5X3NpemVfcmVsYXRpdmV0b3BhdGgiID0+IAlbImRlc2NyaXB0aW9uIiA9PiAiQXZhbGFuY2hlIFJlbGF0aXZlIFBhdGggU2l6ZSIsIAkJImtleSIgPT4gImNvZGUiLAkJImxhYmVsIiA9PiAibGFiZWwiLAkJCSJzb3J0b3JkZXIiID0+ICJsaXN0b3JkZXIiXSwKCQkJImx1dF9hdnlfc3RhcnR6b25lX2hvcml6IiA9PiAJCVsiZGVzY3JpcHRpb24iID0+ICJTdGFydCBab25lIEhvcml6b250YWwgTWVhc3VyZSIsIAkJImtleSIgPT4gImNvZGUiLAkJImxhYmVsIiA9PiAiY29kZSxsYWJlbCIsCSJzb3J0b3JkZXIiID0+ICJsaXN0b3JkZXIiXSwKCQkJImx1dF9hdnlfc3RhcnR6b25lX3ZlcnQiID0+IAkJWyJkZXNjcmlwdGlvbiIgPT4gIlN0YXJ0IFpvbmUgVmVydGljYWwgTWVhc3VyZSIsIAkJImtleSIgPT4gImNvZGUiLAkJImxhYmVsIiA9PiAiY29kZSxsYWJlbCIsCSJzb3J0b3JkZXIiID0+ICJsaXN0b3JkZXIiXSwKCQkJImx1dF9hdnlfdGVybWRlYnJpc19kZXRhaWxlZCIgPT4gCVsiZGVzY3JpcHRpb24iID0+ICJBdmFsYW5jaGUgRGVicmlzIChEZXRhaWxlZCkiLCAJCSJrZXkiID0+ICJjb2RlIiwJCSJsYWJlbCIgPT4gImNvZGUsbGFiZWwiLAkic29ydG9yZGVyIiA9PiAibGlzdG9yZGVyIl0sCgkJCSJsdXRfYXZ5X3Rlcm1kZWJyaXNfbG9uZyIgPT4gCQlbImRlc2NyaXB0aW9uIiA9PiAiTG9uZyBBdmFsYW5jaGUgRGVicmlzIiwgCQkJCSJrZXkiID0+ICJjb2RlIiwJCSJsYWJlbCIgPT4gImNvZGUsbGFiZWwiLAkic29ydG9yZGVyIiA9PiAibGlzdG9yZGVyIl0sCgkJCSJsdXRfYXZ5X3Rlcm1kZWJyaXNfc2hvcnQiID0+IAkJWyJkZXNjcmlwdGlvbiIgPT4gIlNob3J0IEF2YWxhbmNoZSBEZWJyaXMiLCAJCQkia2V5IiA9PiAiY29kZSIsCQkibGFiZWwiID0+ICJjb2RlLGxhYmVsIiwJInNvcnRvcmRlciIgPT4gImxpc3RvcmRlciJdLAoJCQkibHV0X2F2eV90ZXJtaW51c21vaXN0dXJlIiA9PiAJCVsiZGVzY3JpcHRpb24iID0+ICJBdmFsYW5jaGUgVGVybWludXMgTW9pc3R1cmUiLCAJCSJrZXkiID0+ICJjb2RlIiwJCSJsYWJlbCIgPT4gImxhYmVsIiwJCQkic29ydG9yZGVyIiA9PiAibGlzdG9yZGVyIl0sCgkJCSJsdXRfYXZ5X3RyaWdnZXJzIiA9PiAJCQkJWyJkZXNjcmlwdGlvbiIgPT4gIkF2YWxhbmNoZSBUcmlnZ2VyIFR5cGVzIiwgCQkJImtleSIgPT4gImNvZGUiLAkJImxhYmVsIiA9PiAiY29kZSxsYWJlbCIsCSJzb3J0b3JkZXIiID0+ICJjb2RlIl0sCgkJCSJsdXRfYXZ5X3RyaWdnZXJzX2h1bWFubW9kIiA9PiAJCVsiZGVzY3JpcHRpb24iID0+ICJIdW1hbiBNb2RpZmllZCBUcmlnZ2VycyIsIAkJCSJrZXkiID0+ICJjb2RlIiwJCSJsYWJlbCIgPT4gImxhYmVsIiwJCQkic29ydG9yZGVyIiA9PiAibGlzdG9yZGVyIl0sCgkJCSJsdXRfYXZ5X3RyaWd0eXBlcyIgPT4gCQkJCVsiZGVzY3JpcHRpb24iID0+ICJBdmFsYW5jaGUgVHJpZ2dlciBUeXBlcyIsIAkJCSJrZXkiID0+ICJjb2RlIiwJCSJsYWJlbCIgPT4gImxhYmVsIiwJCQkic29ydG9yZGVyIiA9PiAibGlzdG9yZGVyIl0sCgkJCSJsdXRfYXZ5X3R5cGVzIiA9PiAJCQkJCVsiZGVzY3JpcHRpb24iID0+ICJBdmFsYW5jaGUgVHlwZXMiLCAJCQkJCSJrZXkiID0+ICJjb2RlIiwJCSJsYWJlbCIgPT4gImxhYmVsIiwJCQkic29ydG9yZGVyIiA9PiAibGlzdG9yZGVyIl0sCgkJCSJsdXRfb2JzX29ic2VydmVycyIgPT4gCQkJCVsiZGVzY3JpcHRpb24iID0+ICJPYnNlcnZlciBMaXN0IiwgCQkJCQkJImtleSIgPT4gIm9ic2VydmVyX2lkIiwgImxhYmVsIiA9PiAib2JzX2xuYW1lIiwgCSJzb3J0b3JkZXIiID0+ICJvYnNlcnZlcl9pZCJdLAoJCQkibHV0X29ic19zZWFzb25zIiA9PiAJCQkJWyJkZXNjcmlwdGlvbiIgPT4gIk9ic2VydmVkIFNlYXNvbnMiLCAJCQkJCSJrZXkiID0+ICJzZWFzb25faWQiLCAJImxhYmVsIiA9PiAic2Vhc29uX3RleHQiLAkic29ydG9yZGVyIiA9PiAic2Vhc29uX3RleHQiXSwKCQkJImx1dF93eF9haXJ0ZW1wdHJlbmRzIiA9PiAJCQlbImRlc2NyaXB0aW9uIiA9PiAiQWlyIFRlbXBlcmF0dXJlIFRyZW5kcyIsIAkJCSJrZXkiID0+ICJjb2RlIiwJCSJsYWJlbCIgPT4gImxhYmVsIiwJCQkic29ydG9yZGVyIiA9PiAibGlzdG9yZGVyIl0sCgkJCSJsdXRfd3hfcHJlY2lwcmF0ZSIgPT4gCQkJCVsiZGVzY3JpcHRpb24iID0+ICJQcmVjaXBpdGF0aW9uIFJhdGVzIiwgCQkJCSJrZXkiID0+ICJjb2RlIiwJCSJsYWJlbCIgPT4gImxhYmVsIiwJCQkic29ydG9yZGVyIiA9PiAibGlzdG9yZGVyIl0sCgkJCSJsdXRfd3hfcHJlY2lwcmF0ZV9yYWluIiA9PiAJCVsiZGVzY3JpcHRpb24iID0+ICJSYWluIFByZWNpcGl0YXRpb24gUmF0ZSIsIAkJCSJrZXkiID0+ICJjb2RlIiwJCSJsYWJlbCIgPT4gImxhYmVsIiwJCQkic29ydG9yZGVyIiA9PiAibGlzdG9yZGVyIl0sCgkJCSJsdXRfd3hfcHJlY2lwcmF0ZV9zbm93IiA9PiAJCVsiZGVzY3JpcHRpb24iID0+ICJTbm93IFByZWNpcGl0YXRpb24gUmF0ZSIsIAkJCSJrZXkiID0+ICJjb2RlIiwJCSJsYWJlbCIgPT4gImxhYmVsIiwJCQkic29ydG9yZGVyIiA9PiAibGlzdG9yZGVyIl0sCgkJCSJsdXRfd3hfcHJlY2lwdHlwZSIgPT4gCQkJCVsiZGVzY3JpcHRpb24iID0+ICJQcmVjaXBpdGF0aW9uIFR5cGUiLCAJCQkJImtleSIgPT4gImNvZGUiLAkJImxhYmVsIiA9PiAibGFiZWwiLAkJCSJzb3J0b3JkZXIiID0+ICJsaXN0b3JkZXIiXSwKCQkJImx1dF93eF9wcmVzc3VyZXRyZW5kcyIgPT4gCQkJWyJkZXNjcmlwdGlvbiIgPT4gIlByZXNzdXJlIFRyZW5kcyIsIAkJCQkJImtleSIgPT4gImNvZGUiLAkJImxhYmVsIiA9PiAibGFiZWwiLAkJCSJzb3J0b3JkZXIiID0+ICJsaXN0b3JkZXIiXSwKCQkJImx1dF93eF9za3ljb25kaXRpb25zIiA9PiAJCQlbImRlc2NyaXB0aW9uIiA9PiAiU2t5IENvbmRpdGlvbnMiLCAJCQkJCSJrZXkiID0+ICJjb2RlIiwJCSJsYWJlbCIgPT4gImxhYmVsIiwJCQkic29ydG9yZGVyIiA9PiAibGlzdG9yZGVyIl0sCgkJCSJsdXRfd3hfc25vd19ncm91bmQiID0+IAkJCVsiZGVzY3JpcHRpb24iID0+ICJHcm91bmQgU25vdyBDb25kaXRpb25zIiwgCQkJImtleSIgPT4gImNvZGUiLAkJImxhYmVsIiA9PiAibGFiZWwiLAkJCSJzb3J0b3JkZXIiID0+ICJsaXN0b3JkZXIiXSwKCQkJImx1dF93eF9zbm93X3N1cmZhY2UiID0+IAkJCVsiZGVzY3JpcHRpb24iID0+ICJTdXJmYWNlIFNub3cgQ29uZGl0aW9ucyIsIAkJCSJrZXkiID0+ICJjb2RlIiwJCSJsYWJlbCIgPT4gImxhYmVsIiwJCQkic29ydG9yZGVyIiA9PiAibGlzdG9yZGVyIl0sCgkJCSJsdXRfd3hfd2VhdGhlcmxvY2F0aW9ucyIgPT4gCQlbImRlc2NyaXB0aW9uIiA9PiAiV2VhdGhlciBPYnNlcnZhdGlvbiBMb2NhdGlvbnMiLCAJCSJrZXkiID0+ICJjb2RlIiwJCSJsYWJlbCIgPT4gImxhYmVsIiwJCQkic29ydG9yZGVyIiA9PiAibGlzdG9yZGVyIl0sCgkJCSJsdXRfd3hfd2luZF9ibG93aW5ncmlkZ2V0b3BzIiA9PiAJWyJkZXNjcmlwdGlvbiIgPT4gIlJpZGdldG9wIFdpbmQgQmxvd2luZyBDb25kaXRpb25zIiwgCSJrZXkiID0+ICJjb2RlIiwJCSJsYWJlbCIgPT4gImxhYmVsIiwJCQkic29ydG9yZGVyIiA9PiAibGlzdG9yZGVyIl0sCgkJCSJsdXRfd3hfd2luZF9zbm93ZGlyZWN0aW9uIiA9PiAJCVsiZGVzY3JpcHRpb24iID0+ICJTbm93IFdpbmQgRGlyZWN0aW9uIiwgCQkJCSJrZXkiID0+ICJjb2RlIiwJCSJsYWJlbCIgPT4gImxhYmVsIiwJCQkic29ydG9yZGVyIiA9PiAibGlzdG9yZGVyIl0sCgkJCSJsdXRfd3hfd2luZF9zcGVlZGVzdGltYXRlcyIgPT4gCVsiZGVzY3JpcHRpb24iID0+ICJFc3RpbWF0ZWQgV2luZCBTcGVlZHMiLCAJCQkJImtleSIgPT4gImNvZGUiLAkJImxhYmVsIiA9PiAibGFiZWwiLAkJCSJzb3J0b3JkZXIiID0+ICJsaXN0b3JkZXIiXQoJCV07Cgp1c29ydCgkZGF0YSwgbWFrZV9jb21wYXJlcignZGVzY3JpcHRpb24nKSk7CnByaW50X3IoJGRhdGEpOwoKCmZ1bmN0aW9uIG1ha2VfY29tcGFyZXIoKSB7CiAgICAvLyBOb3JtYWxpemUgY3JpdGVyaWEgdXAgZnJvbnQgc28gdGhhdCB0aGUgY29tcGFyZXIgZmluZHMgZXZlcnl0aGluZyB0aWR5CiAgICAkY3JpdGVyaWEgPSBmdW5jX2dldF9hcmdzKCk7CiAgICBmb3JlYWNoICgkY3JpdGVyaWEgYXMgJGluZGV4ID0+ICRjcml0ZXJpb24pIHsKICAgICAgICAkY3JpdGVyaWFbJGluZGV4XSA9IGlzX2FycmF5KCRjcml0ZXJpb24pCiAgICAgICAgICAgID8gYXJyYXlfcGFkKCRjcml0ZXJpb24sIDMsIG51bGwpCiAgICAgICAgICAgIDogYXJyYXkoJGNyaXRlcmlvbiwgU09SVF9BU0MsIG51bGwpOwogICAgfQoKICAgIHJldHVybiBmdW5jdGlvbigkZmlyc3QsICRzZWNvbmQpIHVzZSAoJGNyaXRlcmlhKSB7CiAgICAgICAgZm9yZWFjaCAoJGNyaXRlcmlhIGFzICRjcml0ZXJpb24pIHsKICAgICAgICAgICAgLy8gSG93IHdpbGwgd2UgY29tcGFyZSB0aGlzIHJvdW5kPwogICAgICAgICAgICBsaXN0KCRjb2x1bW4sICRzb3J0T3JkZXIsICRwcm9qZWN0aW9uKSA9ICRjcml0ZXJpb247CiAgICAgICAgICAgICRzb3J0T3JkZXIgPSAkc29ydE9yZGVyID09PSBTT1JUX0RFU0MgPyAtMSA6IDE7CgogICAgICAgICAgICAvLyBJZiBhIHByb2plY3Rpb24gd2FzIGRlZmluZWQgcHJvamVjdCB0aGUgdmFsdWVzIG5vdwogICAgICAgICAgICBpZiAoJHByb2plY3Rpb24pIHsKICAgICAgICAgICAgICAgICRsaHMgPSBjYWxsX3VzZXJfZnVuYygkcHJvamVjdGlvbiwgJGZpcnN0WyRjb2x1bW5dKTsKICAgICAgICAgICAgICAgICRyaHMgPSBjYWxsX3VzZXJfZnVuYygkcHJvamVjdGlvbiwgJHNlY29uZFskY29sdW1uXSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkbGhzID0gJGZpcnN0WyRjb2x1bW5dOwogICAgICAgICAgICAgICAgJHJocyA9ICRzZWNvbmRbJGNvbHVtbl07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIERvIHRoZSBhY3R1YWwgY29tcGFyaXNvbjsgZG8gbm90IHJldHVybiBpZiBlcXVhbAogICAgICAgICAgICBpZiAoJGxocyA8ICRyaHMpIHsKICAgICAgICAgICAgICAgIHJldHVybiAtMSAqICRzb3J0T3JkZXI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAoJGxocyA+ICRyaHMpIHsKICAgICAgICAgICAgICAgIHJldHVybiAxICogJHNvcnRPcmRlcjsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIDA7IC8vIHRpZWJyZWFrZXJzIGV4aGF1c3RlZCwgc28gJGZpcnN0ID09ICRzZWNvbmQKICAgIH07Cn0K