Как упростить код PHP?

288
13 марта 2017, 12:04
function display_soc()
{
    function push_array($array, $name, $class){
        $arr = array(
            'n' => $name,
            'c' => $class
        );
        array_push($array, $arr);
        return $array;
    }
    $soc = array();
    ($vk = get_field('vk_link', 'option'))? $soc = push_array($soc, $vk, 'vk__icon') : '';
    ($fb = get_field('fb_link', 'option')) ? $soc = push_array($soc, $fb, 'fb__icon') : '';
    ($ig = get_field('ig_link', 'option')) ? $soc = push_array($soc, $ig, 'insta__icon') : '';
    ($viber = get_field('viber', 'option')) ? $soc =  push_array($soc, $viber, 'viber__icon') : '';
    ($whatsapp = get_field('whatsapp', 'option')) ? $soc = push_array($soc, $whatsapp, 'wapp__icon') : '';
    ($telegram = get_field('telegram', 'option')) ? $soc = push_array($soc, $telegram, 'telegram__icon') : '';
    $result = '';
    if ($soc) {
        foreach ($soc as $item) {
            $result .= '<a href="' . $item['n'] . '" class="' . $item['c'] . '" target="_blank"></a>' . PHP_EOL;
        }
    }
    return $result;
}

Сдается, что есть более простой способ вывода. Спасибо

Answer 1

Как минимум, вот это:

($vk = get_field('vk_link', 'option'))? $soc = push_array($soc, $vk, 'vk__icon') : '';
($fb = get_field('fb_link', 'option')) ? $soc = push_array($soc, $fb, 'fb__icon') : '';
($ig = get_field('ig_link', 'option')) ? $soc = push_array($soc, $ig, 'insta__icon') : '';
($viber = get_field('viber', 'option')) ? $soc =  push_array($soc, $viber, 'viber__icon') : '';
($whatsapp = get_field('whatsapp', 'option')) ? $soc = push_array($soc, $whatsapp, 'wapp__icon') : '';
($telegram = get_field('telegram', 'option')) ? $soc = push_array($soc, $telegram, 'telegram__icon') : '';

можно записать как:

          // array('vk', 'fb', 'insta', 'viber', 'wapp', 'telegram');
$soc_icons = ['vk', 'fb', 'insta', 'viber', 'wapp', 'telegram']; 
foreach ($soc_icons as $icon) {
    $link = $icon.'_link';
    if ($net_name = get_field($link, 'option'))
        $soc = push_array($soc, $net_name, $icon.'__icon');        
}

чтоб втыкать вообще любые сети, если их количество будет расти.

А еще я не понял зачем в данном случае посредник в виде массива, если возвращаете все равно чисто ссылки.. поэтому вот это:

if ($soc) {        
    foreach ($soc as $key => $item) {
        $result .= '<a href="' . $item['n'] . '" class="' . $item['c'] . '" target="_blank">item№'.$key.'</a>' . PHP_EOL;
    }
}    

мне кажется можно опустить и писать сразу:

$soc_icons = ['vk', 'fb', 'insta', 'viber', 'wapp', 'telegram'];
$result = '';
foreach ($soc_icons as $icon) {
    $link = $icon.'_link';
    if ($net_name = get_field($link, 'option'))            
        $result .= '<a href="' . $net_name . '" class="' . $icon.'__icon' . '" target="_blank"></a>' . PHP_EOL;
}
return $result;

А вот если вы делаете по-умному и хотите разделить логику от представления, то тогда вам надо будет возвращать из функции массив $soc. А уже где-то в представлении делать цикл по данному массиву с формированием ссылок..

Итог у меня получился как-то так (не разделенный на логику и представление):

$soc_icons = ['vk', 'fb', 'insta', 'viber', 'wapp', 'telegram'];
function display_soc($icons_arr) {
    // не знаю что это за функция get_field и что она у вас делает
    // у меня она будет такая тупая))
    function get_field($link, $option) {
        return $link;
    }
    $result = '';
    foreach ($icons_arr as $icon) {
        $link = $icon.'_link';
        if ($net_name = get_field($link, 'option'))            
            $result .= '<a href="' . $net_name . '" class="' . $icon.'__icon' . '" target="_blank"></a>' . PHP_EOL;
    }
    return $result;
}
print_r(display_soc($soc_icons));
READ ALSO
Проблема с curl vk.com

Проблема с curl vk.com

При попытке сделать GET запрос к VKcom для поиска определенной композиции

330
Не могу подключить MySql

Не могу подключить MySql

Здравствуйте, я не давно сменил хостинг для сайта и у меня перестала подключатся база данных и на страницу не выводит никакой ошибки, а на предыдущем...

359
Массив с данными пользователя в сессии PHP MVC

Массив с данными пользователя в сессии PHP MVC

Подскажите, где создать объект пользователя, чтобы данные были доступны во всех роутахДелаю сайт, в основе которого MVC-каркас, c единой точкой...

317
Помогите исправить ошибку в коде pdo

Помогите исправить ошибку в коде pdo

Начал писать разные функции для сокращения кода, и вот на что наткнулсяНаписал такую функцию:

310