【问题标题】:PHP | Simplification of repetitive code using some sort of PHP loop?PHP |使用某种 PHP 循环简化重复代码?
【发布时间】:2018-03-20 10:49:13
【问题描述】:

我想知道你是否可以帮我精简我的代码。

我已经为客户网站构建了一个定制的 share 包含。它工作得很好,但我相信你们中的一个聪明人可以帮助我使它不那么笨重。

我有三个分享网址: $share_url_facebook$share_url_twitter$share_url_linkedin

每个 URL 的结构都不同,而且相当复杂。

然后我有以下代码:

echo '<a href="' . $share_url_facebook . '" title="Share this on facebook">';
echo '<i class="fa fa-facebook"></i>';
echo '</a>';
echo '<a href="' . $share_url_twitter . '" title="Share this on twitter">';
echo '<i class="fa fa-twitter"></i>';
echo '</a>';
echo '<a href="' . $share_url_linkedin . '" title="Share this on LinkedIn">';
echo '<i class="fa fa-linkedin"></i>';
echo '</a>';

有没有办法让我创建某种循环来防止重复?


根据@JasonK 接受的解决方案,这里是我的最终(简化)测试代码:

$share = [
    'facebook' => [
        'title' => 'Facebook',
        'url'   => 'https://www.facebook.com/'
    ],
    'twitter' => [
        'title' => 'Twitter',
        'url'   => 'https://twitter.com'
    ],
    'linkedin' => [
        'title' => 'LinkedIn',
        'url'   => 'https://linkedin.com'
    ]
];
foreach ($share as $key => $details) {
    echo '<a href="' . $details['url'] . '" title="Share this on ' . $details['title'] . '">';
    echo '<i class="fa fa-' . $key . '"></i>';
    echo '</a>';
}

【问题讨论】:

  • 使用不同的值,所以不会重复
  • 您必须创建一个包含 3 个变量值 $share_url_???title 以及 css 类名称 fa-???? 的数组,因此您甚至可能会使用更多代码来尝试创建它数组然后循环遍历它
  • 正如 RiggsFolly 所说,创建一个数组来存储 url。遍历数组
  • 使用$shareBtns = ['socialMediaName' =&gt; 'url', ...] 创建索引数组并对其进行迭代。

标签: php arrays loops foreach


【解决方案1】:

正如您已经建议的那样;创建一个数组并对其进行迭代。

$social = [
    'facebook' => [
        'title' => 'Facebook'
        'url'   => 'https://facebook.com'
    ],
    'twitter' => [
        'title' => 'Twitter'
        'url'   => 'https://twitter.com'
    ],
    'linkedin' => [
        'title' => 'LinkedIn'
        'url'   => 'https://linkedin.com'
    ]
];

foreach ($social as $key => $details) {
    echo 'Key ' . $key;
    echo 'Title ' . $details['title'];
    echo 'URL ' . $details['url'];
}

【讨论】:

    【解决方案2】:

    对此有一个更短的解决方案,它使用 PHP 动态变量,并且不会强制您创建包含所有详细信息的数组。

    这样您就可以保留旧变量。这特别有用,如果它们来自您自己没有编写的文件,因此不能/不想更改

    $social = [ 'facebook', 'twitter', 'linkedin' ];
    foreach ($social as $site) {
        print '<a href="' . ${'share_url_' . $site} . '" title="Share this on ' . $site . '">';
        print '<i class="fa fa-' . $site . '"></i>';
        print '</a>';
    }
    

    【讨论】:

    • 这非常有用,谢谢。我也觉得这很有趣:${'share_url_' . $site}
    • 您基本上可以在大括号内执行所有操作。例如调用函数或方法。请记住,这可能很难调试,因此请谨慎使用。
    • @morgyface 在几乎所有情况下,“可变变量”都是不好的建议/做法。大多数程序员会在短时间内尝试使用它们,但直到他们意识到它们只是数组的糟糕借口。让我为你拯救一个纷争的世界——不要使用可变变量。
    【解决方案3】:

    您可以使用数组来存储“配置”。 key 是服务名称,value 是 url 或带 url 的变量。

    之后,您可以使用 foreach 对该数组进行迭代。 在 foreach 中,您可以使用 echo 或其他函数来输出字符串,或将字符串分配给变量。我使用 sprintf 格式化所有字符串而不进行连接并将其分配给变量http://php.net/manual/en/function.sprintf.php

    $services [
      'facebook' => $share_url_facebook,
      'twitter' => $share_url_twitter
    ]
    $output = '';
    foreach ($services as $serviceName => $url) {
        $output += sprintf(
           '<a href="%s" title="Share this on %s"><i class="fa fa-%s"></i></a>', 
           $url, 
           ucfirst($serviceName),
           $serviceName
       );
    }
    

    【讨论】:

    • 纯代码答案在 StackOverflow 上的价值很低,因为它们对 OP 和成千上万的未来研究人员的教育作用微乎其微。请以教育为目的改进此答案。
    • @mickmackusa 我添加了描述,但我认为这个例子很容易理解,它自我描述了这个解决方案的想法。
    • 即使是简单的 sn-ps 也值得解释。永远不要假设未来的读者对给定语言具有完全的读写能力。 += 执行连接在 php 中看起来很麻烦。在发布之前测试您的代码是个好主意。我通常会在我的答案中添加一个演示链接来仔细检查自己。
    猜你喜欢
    • 2018-10-04
    • 1970-01-01
    • 2011-06-27
    • 2012-03-10
    • 1970-01-01
    • 2021-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多