Skip to content

Instantly share code, notes, and snippets.

@Cherry-Pie
Last active November 24, 2015 00:20
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Cherry-Pie/292d452135984a401bae to your computer and use it in GitHub Desktop.
Save Cherry-Pie/292d452135984a401bae to your computer and use it in GitHub Desktop.
T-T #2

Q:

В переменную $filename записано имя загруженного файла. Получите расширение файла.

A:

$extension = pathinfo($filename, PATHINFO_EXTENSION);

Q:

$data = array(
    0 => 'one', 
    1 => 'two', 
    2 => 'three', 
    3 => 'four', 
    4 => 'five'
);

Выведите содержимое массива нумерованным списком минимум тремя способами. Укажите, какой из них, по вашему мнению, лучший, и почему.

A:

  1. Чревато ошибками, если индексы не с нуля и не по порядку. Обсчет размера массива на каждой итерации.
<ol>
<?php for ($i = 0; $i < count($data); $i++): ?>
    <li><?php echo $data[$i]; ?></li>
<?php endfor; ?>
</ol>
  1. Нечитабельно. Сложно расширять при необходимости.
<ol>
    <?php 
    echo implode(array_map(function($column) {
        return '<li>'. $column .'</li>' ;
    }, $data)); 
    ?>
</ol>
  1. Лучшая читабельность. Расширение функционала не будет представлять проблем.
<ol>
<?php foreach ($data as $number): ?>
    <li><?php echo $number; ?></li>
<?php endforeach; ?>
</ol>

Q:

Оптимизируйте код и укажите, что плохо в данном:

$r = mysql_query('SELECT * FROM `products` WHERE `category` = "'.$category.'"');
$on_stock = 0;
while ($row = mysql_fetch_assoc($r)) {
	$on_stock = $on_stock + $row['on_stock'];
}
echo 'On stock: '.$on_stock;

A:

  • Не "говорящая" о своем содержимом переменная $r.
  • Функция mysql_query считается устаревшей с 5.5.0 и с 7 по дефолту удалена.
  • В запросе sql-инъекция.
  • Запрос тяжелый для текущей задачи.
  • Ну, и $on_stock = $on_stock + $row['on_stock']; можно переписать как $on_stock += $row['on_stock']; для пущей красоты.
$stmt = $pdo->prepare("SELECT SUM(on_stock) as sum_on_stock FROM products WHERE category = ?");
$stmt->execute(array(
    $category
));
$sum = $stmt->fetchColumn();

echo 'On stock: '. $sum;

Q:

Существует таблица gallery, в которой хранятся фотографии:

| id (int) | title (varchar) | author (int) | filename (varchar) | views (int) |

Получите максимальное значение отношения "сумма просмотров фотографий одного автора / количество фотографий одного автора".

A:

SELECT SUM(views) / COUNT(*) as ratio 
FROM gallery 
GROUP BY author 
ORDER BY ratio DESC 
LIMIT 1

Q:

Напишите на JavaScript функции, аналогичные php-функциям in_array(), trim(), asort().

A:

function in_array(needle, haystack, isStrict) 
{
    if (needle.constructor === Array) {
        var result = needle.filter(function(item) { 
            return haystack.indexOf(item) > -1;
        });
        
        return result.length == needle.length; 
    }
    
    var key = '';
    var strict = !!isStrict;
    
    if (strict) {
        for (key in haystack) {
            if (haystack[key] === needle) {
                return true;
            }
        }
    } else {
        for (key in haystack) {
            if (haystack[key] == needle) {
                return true;
            }
        }
    }
  
    return false;
}
function trim(string, charlist) 
{
    var whitespace;
    var length = 0;
    var i = 0;
    var string += '';

    if (!charlist) {
        whitespace = ' \n\r\t\f\x0b\xa0\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u200b\u2028\u2029\u3000';
    } else {
        // preg_quote custom list
        charlist += '';
        whitespace = charlist.replace(/([\[\]\(\)\.\?\/\*\{\}\+\$\^\:])/g, '$1');
    }

    length = string.length;
    for (i = 0; i < length; i++) {
        if (whitespace.indexOf(string.charAt(i)) === -1) {
            string = string.substringing(i);
            break;
        }
    }

    length = string.length;
    for (i = length - 1; i >= 0; i--) {
        if (whitespace.indexOf(string.charAt(i)) === -1) {
            string = string.substringing(0, i + 1);
            break;
        }
    }

    return whitespace.indexOf(string.charAt(0)) === -1 ? string : '';
}

Функцию asort с ее флагами стоит писать только за большой бутерброд. Без понятия что можно увидеть в ее реализации, кроме того, что человек любит заниматься ерундой.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment