Это будет работать, даже если у Вас будет две или больше строки для каждого home
с равным DATETIME
:
SELECT id, home, datetime, player, resource
FROM (
SELECT (
SELECT id
FROM topten ti
WHERE ti.home = t1.home
ORDER BY
ti.datetime DESC
LIMIT 1
) lid
FROM (
SELECT DISTINCT home
FROM topten
) t1
) ro, topten t2
WHERE t2.id = ro.lid
Нет, это невозможно: если вы хотите передать третий параметр, вы должны передать второй. И именованные параметры тоже невозможны.
"Решение" было бы использовать только один параметр, массив, и всегда передавать его ... Но не всегда определяйте в нем все.
Например:
function foo($params) {
var_dump($params);
}
И назвав его так:
foo(array(
'a' => 'hello',
));
foo(array(
'a' => 'hello',
'c' => 'glop',
));
foo(array(
'a' => 'hello',
'test' => 'another one',
));
Вы получите следующий результат:
array
'a' => string 'hello' (length=5)
array
'a' => string 'hello' (length=5)
'c' => string 'glop' (length=4)
array
'a' => string 'hello' (length=5)
'test' => string 'another one' (length=11)
Но мне не очень нравится это решение:
Так что я '
В PHP важен порядок аргументов. Вы не можете указать конкретный аргумент неуместно, но вместо этого вы можете пропустить аргументы, передав значение NULL, если вы не возражаете против значения в вашей функции, имеющего значение NULL.
foo("hello", NULL, "bar");
Нет, это не так.
Единственный способ добиться этого - использовать массивы с именованными ключами и т.п.
Это не совсем красиво, но некоторые могут сказать, что это помогает.
class NamedArguments {
static function init($args) {
$assoc = reset($args);
if (is_array($assoc)) {
$diff = array_diff(array_keys($assoc), array_keys($args));
if (empty($diff)) return $assoc;
trigger_error('Invalid parameters: '.join(',',$diff), E_USER_ERROR);
}
return array();
}
}
class Test {
public static function foobar($required, $optional1 = '', $optional2 = '') {
extract(NamedArguments::init(get_defined_vars()));
printf("required: %s, optional1: %s, optional2: %s\n", $required, $optional1, $optional2);
}
}
Test::foobar("required", "optional1", "optional2");
Test::foobar(array(
'required' => 'required',
'optional1' => 'optional1',
'optional2' => 'optional2'
));