$object = new Object; // Инициализация объекта, который содержит property «a»
$path = 'a->b->c';
$properties = explode('->', $path);
$getProperty = function($obj, $property) {
// Тут какие-нибудь проверки на существование, на instanceof и т. п.
return $obj->$property;
};
$result = array_reduce($properties, $getProperty, $object);
// $result -- это последний property в цепочке, т.е. -- «c»
$xml = new SimpleXMLElement('<xml><a><b><c>test</c></b></a></xml>');
$result = $xml->xpath('//a/b/c');
public static function saveStaff($options)
{
if (self::isValidStaff($options)) {
$staffFields = self::getFilledStaffFileds($options);
$qb = new QueryBuilder( Db::getConnection() );
$qb->where('id = 1')->update('staff', $staffFields);
}
}
public static function getFilledStaffFileds($options)
{
$staff = [];
if ($options['director_surname']) {
$staff['surname'] = $options['director_surname'];
}
if ($options['director_surname']) {
$staff['name'] = $options['director_name'];
}
if ($options['director_surname']) {
$staff['ot4'] = $options['director_ot4'];
}
if ($options['director_surname']) {
$staff['oklad'] = $options['director_oklad'];
}
if ($options['director_surname']) {
$staff['date_start'] = $options['director_date_start'];
}
return $staff;
}
function static function isValidStaff($options)
{
return isset($options['surname'])
|| isset($options['name'])
|| isset($options['ot4'])
|| isset($options['oklad'])
|| isset($options['date_start']);
}
class QueryBuilder {
protected $db;
protected $where = '';
public function __construct($db) {
$this->db = $db;
}
public function where($where)
{
$this->where = trim($where);
return $this;
}
public function update($table, $params)
{
$values = [];
foreach ($params as $key => $value) {
$values[] = "`{$key}` = :{$key}";
}
$sql = 'UPDATE `' . $table . '` SET ' . join(', ', $values);
if ($this->where) {
$sql .= ' WHERE ' . $this->where;
}
$result = $this->db->prepare($sql);
foreach ($params as $key => $value) {
$result->bindParam(':' . $key, $value, PDO::PARAM_STR);
}
return $result->execute();
}
}
А можно избавиться от строки $obj = new MyClass(); и создавать экземпляр автоматически в момент $obj->displayVar();?
Естественно заранее не создавая "впрозапас" по экземпляру каждого класса.
MyClass::getInstance()->displayVar();
MyClass::getInstance()->foo();
MyClass::getInstance()->bar();
class MyClass {
protected static $instance = null;
protected __construct() { }
public static function getInstance() {
if (is_null($this->instance)) {
self::$instance = new self();
}
return self::$instance;
}
}
$tel = filter_input(INPUT_POST, 'tel');
$spam = ! preg_match('/[0-9]{2}/', $tel);
/[0-9]{2}/
— это называется регулярным выражением. Обозначает: [0-9] — любя цифра, {2} — повторяется 2 раза. Вместо [0-9] можно указать эскейп-последовательность \d — которая обозначает любая цифра. Можно написать \d\d — будет искать две любые цифры. $str = 'case:s:webima:http://pk.ve.someurl.com:80/demo,on1_hhh_5@s36016,mob:webima:http://pk.ve.someurl.com:80/demo,t_k275292400,pr:webima:http://pk.ve.someurl.com:80/demo,on0_SHM_12@s36018,default:webima:http://pk.ve.someurl.com:80/demo,5554897363a';
preg_match_all('/http:[^,]*,[^,]*/', $str, $matches);
print_r($matches[0]);
http:[^,]*,[^,]*
http:
— ищем шаблон, который бы начинался с «http:».[^,]*
— ищем последовательность символов, в которой отсутствует запятая. Квадратные скобочки — это синтаксис определения возможных символов, из которых может состоять последовательность. Например [abc] — это шаблон одного символа, который совпадает с только с одной из букв «a», «b» или «c». Крышечка «^» — отрицание присутствия перечисленных символов. Звездочка «*» обозначает повторяемость этого символа от 0 до бесконечного числа раз.,
— просто ищем запятую.[^,]*
— см. п. 2. Т.е. в конце должна идти последовательность, которая не содержит запятые./**
* Случайная выборка с учетом веса каждого элемента.
* @param array $data Массив, в котором ищется случайный элемент
* @param string $column Параметр массива, содержащий «вес» вероятности
* @return int Индекс найденного элемента в массиве $data
*/
function getRandomIndex($data, $column = 'ver') {
$rand = mt_rand(1, array_sum(array_column($data, $column)));
$cur = $prev = 0;
for ($i = 0, $count = count($data); $i < $count; ++$i) {
$prev += $i != 0 ? $data[$i-1][$column] : 0;
$cur += $data[$i][$column];
if ($rand > $prev && $rand <= $cur) {
return $i;
}
}
return -1;
}
// Использование
$games = [
['name' => 'Игра 1', 'ver' => 2], // вероятность 2/15
['name' => 'Игра 2', 'ver' => 0], // вероятность 0/15
['name' => 'Игра 3', 'ver' => 1], // вероятность 1/15
['name' => 'Игра 4', 'ver' => 4], // вероятность 4/15
['name' => 'Игра 5', 'ver' => 8], // вероятность 8/15
];
$i = getRandomIndex($games);
echo $games[$i]['name'];
<br>
, который ставится на месте предполагаемого переноса на новую строку. Расставить эти теги поможет PHP-функция nl2br(), которая дополнит переход на новую строку тегом <br>
.$maxNumber = 10; // Максимальное количество изображений
$validExtensions = array('jpg', 'jpeg', 'png', 'gif'); // Допустимые расширения
$path = 'images/gallery/'; // Директория с картинками
$dir = new DirectoryIterator($path);
foreach ($dir as $file) {
if (!$file->isDot() && in_array($file->getExtension(), $validExtensions)) {
echo "<img src='{$path}{$file->getFilename()}' alt=''>";
if (--$maxNumber == 0) {
break;
}
}
}
$user_id = filter_input(INPUT_POST, 'user_id', FILTER_VALIDATE_INT);