Вы можете использовать простой цикл foreach для итерации по вашему массиву, а затем использовать ключ вспомогательного массива store_id
, чтобы получить ключ окончательного массива. вставьте в этот окончательный массив значение текущего значения.
Кроме того, чтобы удалить дубликаты item_type_id
, я написал бы функцию, которая проверяет, существует ли этот идентификатор в результате.
В примере:
$storeID = [1000,1001];
$array = [
0 => [
"partner_id" => "10017",
"store_id" => "1000",
"item_type_id" => "2",
"value" => "58",
"category" => "1"
],
1 => [
"partner_id" => "10017",
"store_id" => "1000",
"item_type_id" => "1",
"value" => "63",
"category" => "1",
],
2 => [
"partner_id" => "0",
"store_id" => "1000",
"item_type_id" => "3",
"value" => "29",
"category" => "1"
],
3 => [
"partner_id" => "0",
"store_id" => "1000",
"item_type_id" => "2",
"value" => "58",
"category" => "1",
],
4 => [
"partner_id" => "0",
"store_id" => "1001",
"item_type_id" => "1",
"value" => "65",
"category" => "1",
],
5 => [
"partner_id" => "0",
"store_id" => "1001",
"item_type_id" => "2",
"value" => "58",
"category" => "1",
],
6 => [
"partner_id" => "0",
"store_id" => "1001",
"item_type_id" => "3",
"value" => "29",
"category" => "1"
],
7 => [
"partner_id" => "0",
"store_id" => "1000",
"item_type_id" => "1",
"value" => "65",
"category" => "1"
]
];
function ItemIdExists($arr, $itemId)
{
foreach ($arr as $subValue)
{
if ($subValue["item_type_id"] == $itemId)
{
return true;
}
}
return false;
}
$result = array();
foreach ($array as $value)
{
$key = $value["store_id"];
if (in_array($key, $storeID))
{
$ItemIdFound = isset($result[$key]) && ItemIdExists($result[$key], $value["item_type_id"]);
if (!$ItemIdFound)
$result[$key][] = $value;
}
}
var_dump($result);
Выход
array(2) {
[1000]=>
array(3) {
[0]=>
array(5) {
["partner_id"]=>
string(5) "10017"
["store_id"]=>
string(4) "1000"
["item_type_id"]=>
string(1) "2"
["value"]=>
string(2) "58"
["category"]=>
string(1) "1"
}
[1]=>
array(5) {
["partner_id"]=>
string(5) "10017"
["store_id"]=>
string(4) "1000"
["item_type_id"]=>
string(1) "1"
["value"]=>
string(2) "63"
["category"]=>
string(1) "1"
}
[2]=>
array(5) {
["partner_id"]=>
string(1) "0"
["store_id"]=>
string(4) "1000"
["item_type_id"]=>
string(1) "3"
["value"]=>
string(2) "29"
["category"]=>
string(1) "1"
}
}
[1001]=>
array(3) {
[0]=>
array(5) {
["partner_id"]=>
string(1) "0"
["store_id"]=>
string(4) "1001"
["item_type_id"]=>
string(1) "1"
["value"]=>
string(2) "65"
["category"]=>
string(1) "1"
}
[1]=>
array(5) {
["partner_id"]=>
string(1) "0"
["store_id"]=>
string(4) "1001"
["item_type_id"]=>
string(1) "2"
["value"]=>
string(2) "58"
["category"]=>
string(1) "1"
}
[2]=>
array(5) {
["partner_id"]=>
string(1) "0"
["store_id"]=>
string(4) "1001"
["item_type_id"]=>
string(1) "3"
["value"]=>
string(2) "29"
["category"]=>
string(1) "1"
}
}
}
Так, согласно комментарию Richard Szalay:
Ваш лучший выбор состоит в том, чтобы выполнить запрос в фоновом потоке и просто отказаться от подписки от событий контейнерного объекта, когда пользователь поражает Отмену.
И я думаю, что соглашаюсь, что это хорошо обходное решение на данный момент. То, что я хотел бы видеть, уже является некоторой Асинхронной функциональностью запроса в платформе, но пока этого не происходит, это должно будет сделать.
Не начали реализовывать это все же (должны закончить некоторые другие вещи сначала), но один способ, которым это могло работать:
Interrupt
метод рабочего потока, который затем добрался бы ThreadInterruptedException
и прекратите ожидать потока запроса для окончания.Может добавить некоторый код позже, когда я делаю его. Но мы будем видеть, как симпатичный это складывается :p
Я сказал бы, что необходимо будет, вероятно, выполнить его на отдельном Потоке и отмене это вместо этого.
При установке CommandTimeout (секунды) свойство DataContext это автоматически выдаст исключение после того, как тайм-аут протечет.