'apple', 200 => 'banana']; * $opposite = mapkv($data, function($k, $v){ return [-1 * $k => strtoupper($v)]; }); * * This would return [-100 => 'APPLE', -200 => 'BANANA'] * * By convention, mapping functions should return an 1-row array "[newKey => newValue]". * * Some unconventional forms are also defined: * - Return empty array ==> Skip/omit the row * - Return multiple items ==> Add all items to the result * - Return an unkeyed (numeric) array ==> Discard original keys. Items are appended numerically (`$arr[] = $value`). * * @param array $array * Values to iterate over * @param callable $func * Callback function. * function(scalar $key, mixed $value): array * @return array * The filtered array. */ public function mapkv($array, $func) { $r = []; foreach ($array as $k => $v) { foreach ($func($k, $v) as $out_k => $out_v) { if (isset($r[$out_k])) { $r[] = $out_v; } else { $r[$out_k] = $out_v; } } } return $r; } /** * Map file-names. * * @param string $matchPat * Ex: 'src/*.json' * @param string $outPat * Ex: 'dest/#1.json' * @param bool $flip * The orientation of the result map. * If false, returned as "original => filtered". * If true, returned as "filtered => original". * @return array * List of files and the corresponding names. */ public function globMap($matchPat, $outPat, $flip = FALSE) { $inFiles = glob($matchPat); $regex = ';' . preg_quote($matchPat, ';') . ';'; $regex = str_replace(preg_quote('*', ';'), '(.*)', $regex); $replacement = preg_replace(';#(\d+);', '\\' . '\\\1', $outPat); $outFiles = preg_replace($regex, $replacement, $inFiles); return $flip ? array_combine($outFiles, $inFiles) : array_combine($inFiles, $outFiles); } public function chdir($directory) { if (!\chdir($directory)) { throw new IOException("Failed to change directory ($directory)"); } } /** * @param string|string[] $pats * List of glob patterns. * @param null|int $flags * @return array * List of matching files. */ public function glob($pats, $flags = NULL) { $r = []; $pats = (array) $pats; foreach ($pats as $pat) { $r = array_unique(array_merge($r, (array) \glob($pat, $flags))); } sort($r); return $r; } /** * Read a set of files and concatenate the results * * @param string|string[] $srcs * Files to read. These may be globs. * @param string $newLine * Whether to ensure that joined files have a newline separator. * Ex: 'raw' (as-is), 'auto' (add if missing) * @return string * The result of joining the files. */ public function cat($srcs, $newLine = 'auto') { $buf = ''; foreach (glob($srcs) as $file) { if (!is_readable($file)) { throw new \RuntimeException("Cannot read $file"); } $buf .= file_get_contents($file); switch ($newLine) { case 'auto': if (substr($buf, -1) !== "\n") { $buf .= "\n"; } break; case 'raw': // Don't break; } } return $buf; } } __halt_compiler();----SIGNATURE:----Vr92NZM2uUOiY7lChaHcSqgcBMME6uYKjgtxvpJJZo/0DqSWL1ZG3TQc51vnlhAI0RdEmrY6C6Wihwh890P0eeKo2wvbCPQg1cGd4GropHqYJ6UN6vL2RzoWlZpZ6D1rGEierqt4SQ21IIJ+0Xsqaqwx+ieyKZHmNmxjNeBci9sJosiEgR2JeLqRSBHXr+6EYsTByEpBMqWgE/0uakcSynsv0DIkiCIy0859UHiVuBh4NL+FFo2Jc63efFsDV5Xp2x0x1EIxf8FIw7p1N8W91wSUd2PhiZZ6jnIhUEeZwAQ6Ap2h+KEG7fD7XnhldI4jmknSoCBdGKRxnjOPmJgLZUE0kj90jjLzH40JFXgWIhShZASDvlUAZjdXPmC8Rgo4mumVsMrqoSDh9r9iCQMDRPxz7yc0sSFmGWhlRNROIpusRXL/l4H/+5qsA3oA2+UaJ+T4TU7w1bKXPFdhyGs8ewB6TPTXufJIxQLAc/EDLPUtMUUFAxALjhzItsbddA2UJWsOyjtJZwnG8mZPiCvKAJGNwosu3O8QvvbqzNV/1lYgY5zBs+jvGUKh+Or8on2+KwjkDghi2XRl6S0/stDTBzWryCZEoyitiZE/h+hUUKaBN32YYX6tqTFIdR7MWOtRQcpk+qpiCdginH38j2vpfqFUXM7rrN5EqejADrDkbKA=----ATTACHMENT:----NTEwMTU2MDE4NDMwMTM5OCA3MzU5NzY0MTk4MjY3MDQgNDQ1NzA4NzA2NzAxMDQ5Nw==