Заказать многомерный массив с использованием другого массива [duplicate]

Ссылка на

& является ссылочным оператором. Он будет ссылаться на адрес памяти на переменную-указатель.

Пример:

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.
7
задан hakre 4 October 2012 в 09:50
поделиться

4 ответа

В PHP нет встроенной функции, и я не могу думать о какой-либо пользовательской функции, которая будет делать это с помощью usort. Но array_map достаточно прост, imo, так почему бы не использовать его вместо этого?

$sorted = array_map(function($v) use ($data) {
    return $data[$v - 1];
}, $order);
4
ответ дан aurora 18 August 2018 в 12:12
поделиться

В вашем примере идентификаторы в массиве $ 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). Вы не можете сделать лучше.

6
ответ дан Jan-Henk 18 August 2018 в 12:12
поделиться
  • 1
    Ваше последнее решение в основном работает в сахаровом вложенном цикле. Я не думаю, что это будет хорошо масштабироваться. – MegaHit 19 October 2011 в 01:01
  • 2
    @MegaHit увидеть обновленный код в моем ответе, вы не можете сделать лучше, чем это. – Jan-Henk 19 October 2011 в 11:09

Вы можете попробовать использовать пользовательский сортировку с помощью usort () . Таким образом, вы можете использовать первый массив для определения порядка второго массива.

0
ответ дан Justin Lucas 18 August 2018 в 12:12
поделиться
  • 1
    Я посмотрел на usort, но не знаю, работает ли / как это работает с многомерными массивами. – MegaHit 18 October 2011 в 23:25
  • 2
    Вот что делает его настолько полезным. Вы определяете функцию, которая имеет доступ ко всему элементу, будь то просто строка или многомерный массив. Таким образом, в функции сравнения вы можете сравнить каждый индекс значений в массиве заказов. Так что-то вроде этого: return (array_search ($ a ['id'], $ order) & gt; array_search ($ b ['id'], $ order))? -1: 1; – Justin Lucas 18 October 2011 в 23:31

Как бы я это сделал. Я бы использовал пользовательскую функцию 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>";
0
ответ дан Neil 18 August 2018 в 12:12
поделиться