Вы можете использовать usort()
для $array1
и передать $array2
в качестве массива поиска порядка сортировки.
Код: ( Демонстрация )
$array1 = [
[536870914 => 34213897],
[536870914 => 34213905],
[536870915 => 34213921],
[536870914 => 34213913],
[536870915 => 34213929],
[536870917 => 34213937],
[536870925 => 34218049],
];
$array2 = [
536870925,
536870914,
536870915,
536870917,
];
usort($array1, function($a, $b) use ($array2) {
return array_search(key($a), $array2) <=> array_search(key($b), $array2);
});
var_export($array1);
Чтобы сделать этот процесс более эффективным, переверните поисковый массив заранее.
Код: ( Демонстрация )
$array2 = array_flip($array2);
usort($array1, function($a, $b) use ($array2) {
return $array2[key($a)] <=> $array2[key($b)];
});
var_export($array1);
Если некоторые идентификаторы из массива1 не представлены в массиве2, вам необходимо определить, как эти выбросы должны быть отсортированы. Если вы не настроите пропущенные значения в массиве поиска, вы сгенерируете Уведомления и получите неожиданный результат сортировки.
Вот аналогичный пост, который предлагает некоторые рекомендации по этому вопросу:
ориентированное на многопотоковое исполнение решение было бы хорошо
Я предполагаю, что это - только IsBadWritePtr, который не ориентирован на многопотоковое исполнение.
просто делая memcpy в обработчике исключений
Это эффективно, что IsBadReadPtr делает... и если бы Вы сделали это в своем коде, то затем Ваш код имел бы ту же ошибку как реализация IsBadReadPtr: http://blogs.msdn.com/oldnewthing/archive/2006/09/27/773741.aspx
Править:--
Единственная проблема с IsBadReadPtr, о котором я читал, состоит в том, что неверный указатель мог бы указывать (и таким образом, Вы могли бы случайно затронуть), защитная страница стека. Возможно, Вы могли избежать этой проблемы (и поэтому использовать IsBadReadPtr безопасно):
Кроме того, некоторые комментарии, связанные с URL выше также, предлагают использовать VirtualQuery.
Причина, которую эти функции плохи для использования, состоит в том, что проблема не может быть решена надежно.
Что, если функция Вы называете возвраты указателем на память, которая выделяется, таким образом, это выглядит допустимым, но это указывает на другой, несвязанные данные, и повредит Ваше приложение, если Вы будете использовать его.
Скорее всего, функция, которую Вы вызываете на самом деле, ведет себя правильно, и Вы неправильно используете ее. (Не гарантируемый, но это часто имеет место.)
Какая функция - это?
Почему Вы не можете назвать API
AfxIsValidAddress ((p), sizeof (тип), ЛОЖЬ));
если Вы используете VC ++ затем, я предлагаю использовать Microsoft определенные ключевые слова __ попытка __ кроме к и поймать исключения HW
Я боюсь, что Вам не повезло - нет никакого способа надежно проверить законность указателя. Какой код Microsoft дает Вам неверные подсказки?
Любая реализация проверки законности памяти подвергается тем же constriants, которые делают сбой IsBadReadPtr. Можно ли отправить стек вызовов в качестве примера того, где Вы хотите проверить, что законность памяти указателя передала Вам из Windows? Это могло бы помочь другим людям (включая меня), диагностируют, почему необходимо сделать это во-первых.