Kann dieses Snippet weiter optimiert / organisiert werden?
Frage
Aus Meine verwandte Frage Hier bei habe ich den folgenden PHP -Snippet ausgedacht:
$url = parse_url($url);
if (is_array($url))
{
$depth = 2;
$length = 50;
if (array_key_exists('host', $url))
{
$result = preg_replace('~^www[.]~i', '', $url['host']);
if (array_key_exists('path', $url))
{
$result .= preg_replace('~/+~', '/', $url['path']); // normalize a bit
}
if (array_key_exists('query', $url))
{
$result .= '?' . $url['query'];
}
if (array_key_exists('fragment', $url))
{
$result .= '#' . $url['fragment'];
}
if (strlen($result) > $length)
{
$result = implode('/', array_slice(explode('/', $result, $depth + 2), 0, $depth + 1)) . '/';
if (strlen($result) > $length)
{
$result = implode('/', array_slice(explode('/', $result, $depth + 1), 0, $depth + 0)) . '/';
}
$result = substr($result, 0, $length) . '...';
}
}
return $result;
}
Scheint irgendwie hackisch, insbesondere das Duplikat if (strlen($result) > $length)
Codeblöcke. Ich habe darüber nachgedacht, fallen zu lassen parse_url()
insgesamt, aber ich möchte das ignorieren planen, Benutzer, passieren und Hafen.
Ich frage mich, ob ihr eine elegantere / organisiertere Lösung finden könnt, die den gleichen Effekt hat.
Mir ist gerade bemerkt, es gibt einen Fehler - wenn $depth != 2
Der folgende Block ist betroffen:
if (strlen($result) > $length)
{
$result = implode('/', array_slice(explode('/', $result, $depth + 2), 0, $depth + 1)) . '/';
if (strlen($result) > $length)
{
$result = implode('/', array_slice(explode('/', $result, $depth + 1), 0, $depth + 0)) . '/';
}
$result = substr($result, 0, $length) . '...';
}
Ich denke, die beste Lösung ist, eine Schleife zu verwenden. Ich werde versuchen, diese so schnell wie möglich zu beheben. :S
Löste es, indem es durch diesen neuen Snippet ersetzt wurde:
if (strlen($result) > $length)
{
for ($i = $depth; $i > 0; $i--)
{
$result = implode('/', array_slice(explode('/', $result), 0, $i + 1)) . '/';
if (strlen($result) <= $length)
{
break;
}
}
$result = substr($result, 0, $length) . '...';
}
Lösung 2
Hier ist die weniger überfüllte Version, die ich mir ausgedacht habe:
$url = preg_replace('~^www[.]~i', 'http://www.', array_shift($url));
$parts = parse_url($url);
if (is_array($parts))
{
$depth = 2;
$length = 50;
if (array_key_exists('host', $parts))
{
$result = preg_replace('~^www[.]~i', '', $parts['host']);
if (array_key_exists('path', $parts))
{
$result .= preg_replace('~/+~', '/', $parts['path']);
}
if (array_key_exists('query', $parts))
{
$result .= '?' . $parts['query'];
}
if (array_key_exists('fragment', $parts))
{
$result .= '#' . $parts['fragment'];
}
if (strlen($result) > $length)
{
while ($depth > 0)
{
$result = implode('/', array_slice(explode('/', $result), 0, $depth-- + 1)) . '/';
if (strlen($result) <= $length)
{
break;
}
}
$result = substr($result, 0, $length) . '...';
}
return $result;
}
}
Andere Tipps
Für den Anfang könnten Sie haben:
if (is_array($url))
Wiederholen Sie für alle Ihre === true
Operationen. Warum vergleichen Sie Typen?