i
— это индекс массива — номер позиции в нём, считая от 0
.arr[i]
— значение, которое лежит в массиве arr
в позиции i
.arr[4]
например – это пятая по счету коробка, т.к. счет идёт от 0..show-cart
.delete-item
, то действуем далее.$del = $arr[1]['one'];
$del
записался байт ASCII-сивола "1", условно говоря. unset($arr[1]['one'])
$arr = [ 1 => [
'one' => '111',
'two' => '222',
], ];
$del = & $arr[1]; // ссылка на массив
unset($del['one']); // удаление ключа из массива по ссылке
print_r($arr); // результат Array ( [1] => Array ( [two] => 222 ) )
$del
с элементом исходного массива. А массив останется без изменений. $del = & $arr[1]['one']; // ссылка на элемент, который хочется удалить
unset($del); // не сработает. Просто разорвёт ссылку $del на элемент
/**
* Переделать массив объектов, добавив префикс названию каждого из свойств
* @param array<object> $srcArray исходный массив объектов
* @param string $prefix строка, которую добавить перед названием каждого из свойств
*/
$remap = fn (array $srcArray, string $prefix) => array_map(
function ($obj) use ($prefix) {
$keyValues = get_object_vars($obj);
$keys = array_keys($keyValues);
$values = array_values($keyValues);
return (object) array_combine(
array_map(fn ($key) => $prefix . $key, $keys),
$values
);
},
$srcArray
);
// Test
$babySitters = [
(object) ['a'=>'A1', 'b'=>'B-1'],
(object) ['a'=>'A2', 'b'=>'B-2'],
(object) ['a'=>'A3', 'b'=>'B-3'],
(object) ['a'=>'A4', 'b'=>'B-4', 'c'=>'C4'],
];
$result = $remap($babySitters, 'babysitter_');
echo json_encode($result);
[
{
"babysitter_a": "A1",
"babysitter_b": "B-1"
},
{
"babysitter_a": "A2",
"babysitter_b": "B-2"
},
{
"babysitter_a": "A3",
"babysitter_b": "B-3"
},
{
"babysitter_a": "A4",
"babysitter_b": "B-4",
"babysitter_c": "C4"
}
]
heap_size_limit
, например, из командной строки:node -e 'const { getHeapStatistics } = require("node:v8"); console.log(getHeapStatistics().heap_size_limit);'
export NODE_OPTIONS=--max_old_space_size=4096
document.body.addEventListener('click', e => {
e.stopPropagaion();
e.stopImmediatePropagation();
e.preventDefault();
}, { capture: true });
Аналогично можно и для клавиатурных событий попробовать. function workHours(on, off, testNow = null) {
// TODO: validate input
const now = testNow ?? new Date().getHours();
const a = Number(on);
let b = Number(off);
const format = (status, nextTime) => ({ status, next_time: nextTime });
if (a === b) {
return format(true, 0);
}
if (a > b) {
b += 24;
}
if (now >= a && now < b) {
return format(true, 0);
}
if (now < a) {
return format(false, a - now);
}
return format(false, a + 24 - now);
}
// Тесты тесты
const tests = [
[9, 17, 10, { status: true, next_time: 0 }],
[9, 17, 8, { status: false, next_time: 1 }],
[9, 17, 17, { status: false, next_time: 16 }],
[19, 17, 17, { status: false, next_time: 2 }],
[19, 19, 17, { status: true, next_time: 0 }],
];
const eq = (a, b) => Object.entries(a).every(([k, v]) => b[k] === v);
tests.forEach(test => {
const [on, off, now, expected] = test;
const result = workHours(on, off, now);
const testResult = eq(result, expected);
if (testResult) {
console.log('Passed', {on, off, now, result});
}
console.assert(testResult, test);
});
- console.log(data.data.values)
+ console.log(data.values)
range
, majorDimension
и values
. Последнее и интересует.