require
выдает ошибку, а не бросает исключение, поэтому обрабатывать ее нужно с помощью функций set_error_handler
и register_shutdown_function
function myErrorHandler($errno, $errstr, $errfile, $errline)
{
print "<pre>"; print_r($errstr); print "</pre>";
}
function myShutdownHandler()
{
print "<pre>"; print_r(error_get_last()); print "</pre>";
}
set_error_handler('myErrorHandler');
register_shutdown_function('myShutdownHandler');
//Require-скрипты
file_exists()
) и после этого уже подключать его. make_upload
вы изменяете локальную версию переменной $ava
, т.е. ту, которая доступна только в пределах функции make_upload
. global
в функции make_upload
, чтобы изменить значение глобальной переменной $ava
:function make_upload($file){
global $ava;
$ava = $href;
// ...
}
array_column
много одинаковых значений, но с разными ключами. array_flip
для таких значений возвращает последний найденный ключ (например, 12856 вместо 32 в вашем случае).
Если значение встречается несколько раз, для обработки будет использоваться последний встреченный ключ, а все остальные будут потеряны.
$_POST
действительно передаются id и carname:print("<pre>");print_r($_POST);print("</pre>");
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING);
$sql = 'UPDATE `cars` SET `name` = :carname WHERE `id` = :id';
$s = $db->prepare($sql);
$s->bindValue(':id', $_POST['id']);
$s->bindValue(':carname', $_POST['carname']);
$s->execute();
print("<pre>");print_r($s->errorInfo());print("</pre>");
<div>
<?php foreach($images as $img): ?>
<img src="images/<?=$img?>" alt="" width="200">
<?php endforeach; ?>
</div>
<?php
вместо <?
. Чтобы использовать второй вариант (как в вашем примере) в php.ini параметр short_open_tag
должен быть равен On
PREG_PATTERN_ORDER
Упорядочивает результаты так, что элемент $matches[0] содержит массив полных вхождений шаблона, элемент $matches[1] содержит массив вхождений первой подмаски и т.д.
$arr = [
['id' => 1, 'sub_id' => null, 'name'=> 'name1'],
['id' => 2, 'sub_id' => 1, 'name'=> 'name2'],
['id' => 3, 'sub_id' => 1, 'name'=> 'name3'],
['id' => 4, 'sub_id' => null, 'name'=> 'name4'],
['id' => 5, 'sub_id' => 2, 'name'=> 'name5'],
['id' => 6, 'sub_id' => 4, 'name'=> 'name6'],
];
/* https://stackoverflow.com/a/28429487 */
function buildTree(array &$elements, $parentId = 0) {
$branch = array();
foreach ($elements as &$element) {
if ($element['sub_id'] == $parentId) {
$children = buildTree($elements, $element['id']);
if ($children) {
$element['children'] = $children;
}
$branch[$element['id']] = $element;
unset($element);
}
}
return $branch;
}
function printTree(array $arr, $level=1) {
foreach ($arr as $k => $v) {
print(str_repeat('-', $level) . $v['name'] ."\n");
if(isset($v['children']) && is_array($v['children'])) {
printTree($v['children'], $level + 1);
}
}
}
printTree(buildTree($arr));
$arr = [
["small"=> "/images/0001_GOLD.jpg"],
["small"=> "/images/003_lux.jpg"],
["small"=> "/images/002_prod_3.jpg"],
["small"=> "/images/0002_GOLD.jpg"],
["small"=> "/images/002_prod_5.jpg"],
["small"=> "/images/002_lux.jpg"],
["small"=> "/images/002_prod_4.jpg"],
];
$lux = [];
$prod = [];
$gold = [];
foreach ($arr as $v) {
if(strpos($v['small'], 'lux') !== false) {
$lux[] = $v;
}
if(strpos($v['small'], 'prod_') !== false) {
$prod[] = $v;
}
if(strpos($v['small'], 'GOLD') !== false) {
$gold[] = $v;
}
}
print_r(array_merge($lux, $prod, $gold));
.htaccess
. Часто для него дополнительно ограничивают права. @param
используется для документирования аргумента функции или метода. В основном для улучшения автокомплита в ide.$file_url
, поэтому в ней указан относительный путь.$_SERVER['HTTP_HOST']
class Entity
{
public function add(ComplexEntityValidator $validator) {
$validator->validate();
}
}
class ComplexEntityValidator
{
public function __construct(EntityRepository $repository) {
}
public function validate() {
// проверка
}
}
class EntityApplicationService
{
public function __construct(ComplexEntityValidator $validator) {
}
public function __invoke() {
$entity = new Entity();
$entity->add($validator);
// сохранение сущности
}
}
Расстояние Левенштейна - это минимальное количество вставок, замен и удалений символов, необходимое для преобразования str1 в str2. Сложность алгоритма равна O(m*n), где n и m - длины строк str1 и str2 (неплохо по сравнению с similar_text(), имеющей сложность O(max(n,m)**3), но все же довольно много).
echo(levenshtein('abcdefg', 'amcdehg'));
$lines = [
'Продам клинок демона +6 / Солнцеликий плащ +2 тьма',
'Продам клинок демона +6, Солнцеликий плащщ +2тьма',
'Акция! Продам клинок демона +6, Солнцеликий плащ +2тьма',
'Продам клинок ангела +3, Луноликая куртка +4свет',
'Продам клинок ангелла +3, Луноликая куртка +4свет',
'Акция ! Продам клинок ангела +3, Луноликая куртка +4свет',
'тест акции',
'проверка демона',
'проверка ангела',
];
$res = [];
$allSimilar = [];
foreach ($lines as $line) {
$similarLines = [];
if(in_array($line, $allSimilar)) {
continue;
}
foreach ($lines as $line1) {
$lev = mb_levenshtein($line, $line1);
$maxDistance = (int)(0.2 * max(mb_strlen($line), mb_strlen($line1)));
if($lev <= $maxDistance) {
$similarLines[] = $line1;
$allSimilar[] = $line1;
}
}
$res[$line] = $similarLines;
}
print_r($res);
trait ErrorTrait
{
public function someMethod($someArg) {
echo __TRAIT__ . ": " . $someArg . "\n";
}
}
trait OtherFirstTrait
{
abstract public function someMethod($someArg);
public function someMethod1($someArg) {
echo __TRAIT__ . ": " . $someArg . "\n";
$this->someMethod($someArg);
}
}
trait OtherSecondTrait
{
abstract public function someMethod($someArg);
public function someMethod2($someArg) {
echo __TRAIT__ . ": " . $someArg . "\n";
$this->someMethod($someArg);
}
}
abstract class MainClass
{
use ErrorTrait;
}
class ChildCLass extends MainClass
{
use OtherFirstTrait, OtherSecondTrait;
}
$o = new ChildCLass();
$o->someMethod("test ErrorTrait");
print("\n");
$o->someMethod1("test OtherFirstTrait");
print("\n");
$o->someMethod2("test OtherSecondTrait");
ErrorTrait: test ErrorTrait
OtherFirstTrait: test OtherFirstTrait
ErrorTrait: test OtherFirstTrait
OtherSecondTrait: test OtherSecondTrait
ErrorTrait: test OtherSecondTrait