&
является ссылочным оператором. Он будет ссылаться на адрес памяти на переменную-указатель.
int *p;
int a=5;
p=&a; // Here Pointer variable p refers to the address of integer variable a.
Оператор разыменования *
используется переменной указателя для прямое обращение к значению переменной вместо адреса памяти.
int *p;
int a=5;
p=&a;
int value=*p; // Value variable will get the value of variable a that pointer variable p pointing to.
В PHP нет встроенной функции, и я не могу думать о какой-либо пользовательской функции, которая будет делать это с помощью usort. Но array_map достаточно прост, imo, так почему бы не использовать его вместо этого?
$sorted = array_map(function($v) use ($data) {
return $data[$v - 1];
}, $order);
В вашем примере идентификаторы в массиве $ data нумеруются последовательно и начинаются с 1. Код, который я даю ниже, предполагает, что это всегда так. Если это не так, код не работает.
$result = array();
$index = 0;
foreach ($order as $position) {
$result[$index] = $data[$position - 1];
$index++;
}
В http://codepad.org/YC8w0yHh вы можете видеть, что он работает для ваших данных примера .
EDIT
Если упомянутое выше предположение не выполняется, следующий код достигнет того же результата:
<?php
$data = array(
array('id' => 1, 'title' => 'whatever'),
array('id' => 2, 'title' => 'whatever'),
array('id' => 3, 'title' => 'whatever')
);
$order = array(2,3,1);
$order = array_flip($order);
function cmp($a, $b)
{
global $order;
$posA = $order[$a['id']];
$posB = $order[$b['id']];
if ($posA == $posB) {
return 0;
}
return ($posA < $posB) ? -1 : 1;
}
usort($data, 'cmp');
var_dump($data);
См. http: //codepad.org/Q7EcTSfs для доказательства.
Вызывая array_flip () в массиве $ order, он может использоваться для поиска позиции. Это похоже на поиск хеш-таблицы, который является линейным по времени или O (n). Вы не можете сделать лучше.
Вы можете попробовать использовать пользовательский сортировку с помощью usort () . Таким образом, вы можете использовать первый массив для определения порядка второго массива.
Как бы я это сделал. Я бы использовал пользовательскую функцию usort (arr_sort) в сочетании с массивом $ data.
<?php
$order = array(2,3,1);
$data = array(
array('id' => 1, 'title' => 'whatever'),
array('id' => 2, 'title' => 'whatever'),
array('id' => 3, 'title' => 'whatever')
);
function arr_sort($a,$b){
global $order;
foreach ($order as $key => $value) {
if ($value==$a['id']) {
return 0;
break;
}
if ($value==$b['id']) {
return 1;
break;
}
}
}
usort($data,'arr_sort');
echo "<pre>";
print_r($data);
echo "<pre>";