// получаем локальное хранилище (тут может быть запрос в БД)
// * функция _pluck работает примерно как array_column только умнее - обрезает массив именованных массивов оставляя в каждом ключе значение только одной ячейки вместо всего массива, в underscore/lodash такая штука есть), вторым параметром принимает массив нужных полей (в нашем случае - null = весь массив без изменений), в третьем - колонку, которая станет ключом - то есть здесь получилось чтобы просто значения колонки code, сделали ключами
$full_arr = _pluck(json_decode(file_get_contents($this->full_path), true), null, "code");
// получаем удаленное хранилище (тут запрос на другой сервер, потом переназначение колонок, проверка минимального их количества, проверка значений данных)
$current_arr = $this->getData();
// получаем УДАЛЕННЫЕ товары
// - в товаре не хватает полей
// - товар с таким кодом когда-то был, а теперь исчез
// - количество товара меньше требуемого
// для этого
// 1. получить плохие элементы из текущей выгрузки
// 2. получить элементы, которые раньше когда-либо попадались, а теперь их почему-то нету
// 3. получить элементы, в которых количество меньше требуемого
// 4. проставить им флаг "удаленный"
// 5. в массив для синхронизации добавить только те удаленные, которые не были удалены раньше
$process_current_arr = array_filter($current_arr, function ($v) {
// тут функция проверяющая наличие колонок для сравнения - ну то есть сравнение производится по такому-то набору колонок id, code, param1, param2, нужно убедится что эти колонки есть, в противном случае элемент ставится как плохой
return $this->filterData($v);
});
$deleted_arr = array_diff_key($current_arr, $process_current_arr);
$deleted_arr = array_replace($deleted_arr, array_diff_key($full_arr, $process_current_arr));
$deleted_arr = array_replace($deleted_arr, array_filter($process_current_arr, function ($v) {
return ($v["count"] < $this->count);
}));
$deleted_arr = array_map(function ($v) {
$v["deleted"] = 1;
return $v;
}, $deleted_arr);
$process_current_arr = array_diff_key($process_current_arr, $deleted_arr);
$sync_arr = array_replace($sync_arr, array_intersect_key($deleted_arr, array_filter(array_replace($deleted_arr, array_intersect_key($full_arr, $deleted_arr)), function ($v) {
return (empty($v["deleted"]));
})));
// получаем ВОССТАНОВЛЕННЫЕ товары
// - товары которые были удалены, а теперь они соответствуют требованиям
// для этого
// 1. находим удаленные товары в нашем хранилище
// 2. методом исключения определяем, какие товары есть в нашей выгрузке
$recovered_arr = array_intersect_key($process_current_arr, array_filter($full_arr, function ($v) {
return (!empty($v["deleted"]) && (strval($v["deleted"]) === "1"));
}));
$recovered_arr = array_map(function ($v) {
$v["deleted"] = 0;
return $v;
}, $recovered_arr);
$sync_arr = array_replace($sync_arr, $recovered_arr);
$process_current_arr = array_diff_key($process_current_arr, $recovered_arr);
// получаем НОВЫЕ товары
// - товары которых в нашем хранилище нету
// для этого
// 1. методом исключения по коду сравниваем хранилище и оставшиеся для обработки элементы
$new_arr = array_diff_key($process_current_arr, $full_arr);
$sync_arr = array_replace($sync_arr, $new_arr);
$process_current_arr = array_diff_key($process_current_arr, $new_arr);
// получаем ИЗМЕНЕННЫЕ товары
// - товары которые есть и в нашем хранилище и в выгрузке, но данные отличаются
// для этого
// 1. методом соответствия по хешу сравниваем хранилище и оставшиеся для обработки элементы
// * hashData - функция которая отбирает из массива значения нужных колонок и по ним делает хеш, не учитывая остальное
$process_current_arr_md5 = array_combine(array_map(array($this, "hashData"), $process_current_arr), $process_current_arr);
$full_arr_md5 = array_combine(array_map(array($this, "hashData"), $full_arr), $full_arr);
$updated_arr = _pluck(array_diff_key($process_current_arr_md5, $full_arr_md5), null, "code");
$sync_arr = array_replace($sync_arr, $updated_arr);
$process_current_arr = array_diff_key($process_current_arr, $updated_arr);
// Соединяем старые данные с новыми, чтобы ничего не потерять
$filemtime = date("Y-m-d H:i:s", filemtime($this->sync_path));
$sync_arr = array_replace(array_intersect_key($full_arr, $sync_arr), $sync_arr);
// Тут в конце соединяем наш full и sync, сохраняем или просто sync выводим, чтобы увидеть отличающиеся записи в прайсе и бд
<?php
error_reporting(0);
// эмуляция БД - если у вас SQL - это не нужно
$menu = array(
array("id", "parent_id", "level"),
array(1, 0, 0),
array(2, 0, 0),
array(3, 0, 0),
array(4, 0, 0),
array(5, 0, 0),
array(6, 0, 0),
array(7, 0, 0),
array(8, 0, 0),
array(9, 0, 0),
array(10, 0, 0),
array(11, 0, 0),
array(17, 15, 1),
array(18, 15, 1),
array(19, 15, 1),
array(20, 15, 1),
array(21, 15, 1),
array(22, 15, 1),
array(23, 15, 1),
array(17, 1, 2),
array(18, 1, 2),
array(19, 1, 2),
array(20, 1, 2),
array(21, 1, 2),
array(22, 1, 2),
array(23, 1, 2),
array(24, 16, 1),
array(25, 16, 1),
array(26, 16, 1),
array(27, 16, 1),
array(28, 16, 1),
array(24, 2, 2),
array(25, 2, 2),
array(26, 2, 2),
array(27, 2, 2),
array(28, 2, 2),
array(12, 1, 1),
array(13, 1, 1),
array(14, 1, 1),
array(15, 1, 1),
array(16, 2, 1),
);
$columns = array_shift($menu);
$menu = array_map(function ($v) use ($columns) {
return array_combine($columns, array_replace(array_fill(0, count($columns), NULL), $v));
}, $menu);
// сортируем правильно - если у вас SQL - делайте в запросе
usort($menu, function ($a, $b) {
return 0
?: ($a["level"] - $b["level"])
?: ($a["parent_id"] - $b["parent_id"])
?: ($a["id"] - $b["id"]);
});
// выбираем в массив по родителям
$menu_parents = array();
foreach ($menu as $v):
$menu_parents[$v["parent_id"]][] = $v;
endforeach;
// пробегаем каждый элемент собирая потомки по очереди
function tree($arr, $parent_id = 0, &$res = array()) {
foreach ($arr[$parent_id] as $v):
$id = $v["id"];
if (!isset($res[$id])):
$res[$id] = $v;
elseif ($res[$id]["level"] < $v["level"]):
$res[$id] = $v;
endif;
if (isset($arr[$id])):
tree($arr, $id, $res);
endif;
endforeach;
return $res;
}
$menu = tree($menu_parents);
echo "<pre>";
print_r($menu);
<?
$text = <<<TEXT
<scriptsrc=""></script>
<script blablabla src=""></script>
<script src=""></script>
<script blabl abla src="123.js"></script>
<script bla 22bl2 abla src="tanks/tank.js"></script>
TEXT;
$match = array();
$tmp = str_replace("<script", "|script", $text);
preg_match_all('/\|script[^<>]+src=[\'"]([^\'"]+)/ium', $tmp, $match);
echo "<pre>";
print_r($match);
<div class="mydiv">
</div>
<script src="//code.jquery.com/jquery-1.12.0.min.js"></script>
<script>
$.noConflict();
(function ($) {
$(function () {
$('.mydiv').on('click', function() {
$.ajax('set.php', {
'clicked_div' : 1
});
});
});
})(jQuery);
</script>
<?php
!empty($_REQUEST['clicked_div']) || exit('Див не нажат');
$_SESSION['your_data'] = 1;
$arr = json_decode(file_get_contents());
$app = Framework::init();
$app->config = array_merge($app->config, $arr);
App = {};
Module = {
b : function() {}
};
App.b = Module.b;
App.b();