As the title says, I'm looking for a better way of writing the following PHP function as it's a very very long one. It's part of a bigger class and I'm trying to keep the amount of code as little as possible.
The reason why I needed so many cases is because the function can accept all kinds of arguments in different ways. It might not make any sense just by looking at it, but I can provide a short description of the behavior :
public function get_new_files() {
$arguments = [];
$args = func_get_args();
$args_count = func_num_args();
$files = [];
$set = $this->methods["Public"][8];
$public_url = $this->public_url;
switch ($args_count) {
case 1:
switch (gettype($args[0])) {
case 'string':
$arguments = $this->filter_arguments_recursive($args, $args_count);
switch (count($arguments)) {
case 0:
case 1:
return json_encode("[ Get Items [ New ][ Failed ] | Arguments [ Insufficient ][ 2 Required ] ]");
break;
case 2:
$url = preg_replace('/set/i', $set . ":" . $arguments[0] . "," . $arguments[1], $public_url);
$files = [
"Marketplaces" => [
"Marketplace" => $arguments[0],
"Categories" => [
$arguments[1] => $this->fetch($url, $set)
]
]
];
break;
case 3:
default:
return json_encode("[ Get Items [ New ][ Failed ] | Arguments [ Exceeded ][ 2 Required ] ]");
break;
};
break;
case 'array':
switch (count($args[0])) {
case 0:
return json_encode("[ Get Items [ New ][ Failed ] | Arguments [ Insufficient ][ 2 Required ] ]");
break;
case 1:
$arguments = $this->filter_arguments_recursive($args, $args_count);
switch (count($arguments)) {
case 0:
case 1:
return json_encode("[ Get Items [ New ][ Failed ] | Arguments [ Insufficient ][ 2 Required ] ]");
break;
case 2:
$url = preg_replace('/set/i', $set . ":" . $arguments[0] . "," . $arguments[1], $public_url);
$files = [
"Marketplaces" => [
"Marketplace" => $arguments[0],
"Categories" => [
$arguments[1] => $this->fetch($url, $set)
]
]
];
break;
case 3:
default:
return json_encode("[ Get Items [ New ][ Failed ] | Arguments [ Exceeded ][ 2 Required ] ]");
break;
};
break;
case 2:
switch (gettype($args[0][0])) {
case 'string':
switch (gettype($args[0][1])) {
case 'string':
$arguments = $this->filter_arguments_recursive([ $args[0][1] ], 1);
switch (count($arguments)) {
case 0:
return json_encode("[ Get Items [ New ][ Failed ] | Arguments [ Category ][ Missing ][ 1 + Required ] ]");
break;
case 1:
$url = preg_replace('/set/i', $set . ":" . $args[0][0] . "," . $arguments[0], $public_url);
$files = [
"Marketplaces" => [
"Marketplace" => $args[0][0],
"Categories" => [
$arguments[0] => $this->fetch($url, $set)
]
]
];
break;
case 2:
default:
$results = [];
foreach ($arguments as $key => $argument) {
$url = preg_replace('/set/i', $set . ":" . $args[0][0] . "," . $argument, $public_url);
array_push($results, [ $argument => $this->fetch($url, $set) ] );
};
unset($argument);
$files = [
"Marketplaces" => [
"Marketplace" => $args[0][0],
"Categories" => $results
]
];
break;
};
break;
case 'array':
$results = [];
foreach ($args[0][1] as $key => $argument) {
$url = preg_replace('/set/i', $set . ":" . $args[0][0] . "," . $argument, $public_url);
array_push($results, [ $argument => $this->fetch($url, $set) ] );
};
unset($argument);
$files = [
"Marketplaces" => [
"Marketplace" => $args[0][0],
"Categories" => $results
]
];
break;
default:
return json_encode("[ Get Items [ New ][ Failed ] | Arguments [ Unknown Type ][ String Required ] ]");
break;
};
break;
default:
return json_encode("[ Get Items [ New ][ Failed ] | Arguments [ Unknown Type ][ String Required ] ]");
break;
};
break;
default:
return json_encode("[ Get Items [ New ][ Failed ] | Arguments [ Exceeded ][ 2 Required ] ]");
break;
};
break;
default:
return json_encode("[ Get Items [ New ][ Failed ] | Arguments [ Unknown Type ][ String Required ] ]");
break;
};
break;
case 2:
switch (gettype($args[0])) {
case 'string':
switch (gettype($args[1])) {
case 'string':
$arguments = $this->filter_arguments_recursive([ $args[1] ], 1);
switch (count($arguments)) {
case 0:
return json_encode("[ Get Items [ New ][ Failed ] | Arguments [ Category ][ Missing ][ 1 + Required ] ]");
break;
case 1:
$url = preg_replace('/set/i', $set . ":" . $args[0] . "," . $arguments[0], $public_url);
$files = [
"Marketplaces" => [
"Marketplace" => $args[0],
"Categories" => [
$arguments[0] => $this->fetch($url, $set)
]
]
];
break;
case 2:
default:
$results = [];
foreach ($arguments as $key => $argument) {
$url = preg_replace('/set/i', $set . ":" . $args[0] . "," . $argument, $public_url);
array_push($results, [ $argument => $this->fetch($url, $set) ] );
};
unset($argument);
$files = [
"Marketplaces" => [
"Marketplace" => $args[0],
"Categories" => $results
]
];
break;
};
break;
case 'array':
$results = [];
foreach ($args[1] as $key => $argument) {
$url = preg_replace('/set/i', $set . ":" . $args[0] . "," . $argument, $public_url);
array_push($results, [ $argument => $this->fetch($url, $set) ] );
};
unset($argument);
$files = [
"Marketplaces" => [
"Marketplace" => $args[0],
"Categories" => $results
]
];
break;
default:
return json_encode("[ Get Items [ New ][ Failed ] | Arguments [ Unknown Type ][ String Required ] ]");
break;
};
break;
default:
return json_encode("[ Get Items [ New ][ Failed ] | Arguments [ Unknown Type ][ String Required ] ]");
break;
};
break;
default:
return json_encode("[ Get Items [ New ][ Failed ] | Arguments [ Exceeded ][ 2 Required ] ]");
break;
};
return $this->json_encode_f_object([ "Items" => [ "New" => $files ] ]);
}
Description : Well, the main purpose of this function is to get the newest items published on some website ( through their API ). The function needs two arguments as a starting point : a marketplace
and a category
;
Based on those arguments, I get a JSON back with some info. What I do before doing that is filtering the arguments :
- first case would be that the user simply gives the function one string which contains the market and the category to ( only one category and market at a time is accepted ) separated by whitespace, comma, etc. So what I do is split that string and return an array with the two values and then fire the actual GET;
- another case would be that the user gives two strings, then do the above again to make sure I don't have whitespace or more arguments in each string
- then, the user can also pass an array with one string which meets the same conditions as the first case, or with two strings which again meets the same case as the first, but if the second string contains more than one word ( separated again by whitespace, comma, etc. ) then do a GET for the same market but with each category
I could go on with the description and be more specific, but I think the above covers the bigger picture and why I have so many cases :)
I hope someone has a better view of how I could approach this as I haven't coded PHP in some years now so I'm a bit rusty :)
Function Call Example : I think it would make sense to paste an example of how this could be called :
$test->get_new_files_from_market("themeforest", ["wordpress", "cms-themes", "psd-templates"]);
$test->get_new_files_from_market("themeforest", "wordpress, cms-themes, psd-templates");
$test->get_new_files_from_market("themeforest", "wordpress");
$test->get_new_files_from_market("themeforest, wordpress");
$test->get_new_files_from_market(["themeforest", "wordpress"]);
The way of calling it could go on, as maybe you can figure out from the function's cases :)