2012-04-19 3 views
10

Использование CakePHP 2.0 здесь. Название немного вводит в заблуждение, поэтому, чтобы очистить вещи, у меня есть сеансовый массив, который заполнен идентификаторами продуктов, поскольку пользователь добавляет их в корзину. Таким образом, этот массив имеет вид [0] => 25, [1] => 70 и т. Д. Предположим, что этот массив называется $ продуктами.Как сортировать массив, сохраняя его начальное состояние

Я хочу спросить, есть ли возможность иметь массив, который я получаю, используя функцию 'find' ('conditions' => array ('Product.id' => $ products)) для сортировки не по некоторым значениям Model.field (как в опции «order»), а по индексам массивов $ products, поэтому, когда я представляю содержимое продуктов в поле зрения, я получаю все эти продукты в корзине, отсортированные в такой последовательности, как пользователь добавлял их ,

Вот пример - Session массив $ продуктов:

[0] => 35, 
[1] => 15, 
[2] => 25 

Затем я передаю этот массив в условиях функции найти:

$list = $this->Product->find('all', array('conditions' => array('Product.id' => $products))); 

В конце $ список дает мне массив, отсортированный по Код товара. Поэтому вместо того, чтобы:

[0] => Array 
    (
     [Product] => Array 
      (
       [id] => 35)), 
[1] => Array 
     (
      [Product] => Array 
       (
        [id] => 15)), 

[2] => Array 
     (
      [Product] => Array 
       (
        [id] => 25)) 

я получаю:

[0] => Array 
    (
     [Product] => Array 
      (
       [id] => 15)), 
[1] => Array 
     (
      [Product] => Array 
       (
        [id] => 25)), 
[2] => Array 
     (
      [Product] => Array 
       (
        [id] => 35)) 

До сих пор все ответы не решить мою проблему. Пожалуйста, обратите более пристальное внимание на пример, который я дал, это очень просто, но ответы предоставляются в другом ключе.

Опять же, мне нужно окончательный массив список $ быть отсортированы по показателям массива сессии $ продуктов, но я получаю список $ отсортированный по полю Product.id, даже если я не указываем 'find(array('order'=> ...))' и даже попытался установить его на ложь.

+3

не может понять вопрос, но я думаю, что это может помочь ... Вы не можете сортировать массив сохраняя свое первоначальное состояние (потому что вы его заказываете), но вы можете сохранить его дважды или даже лучше, вы можете хранить индексы массива в своем первоначальном состоянии, поэтому вы можете заказать массив, как и в вашем начальном состоянии (или наоборот), когда захотите. $ initial_state_indexes = array_keys ($ the_array); –

+0

Согласитесь, вопрос немного расплывчатый ... Попробуйте уточнить свою точку с кодом или подойти к ней под другим углом. – mseancole

+0

Я вообще не использую «заказ».Как я уже говорил, массивы $ -секундных массивов содержат идентификаторы продуктов, в которых индексы (от [0] и т. Д.) Представляют собой последовательность продуктов, добавленных пользователем. –

ответ

2

Не хочу звучать грубо, но все ответы на мой вопрос касались того, как заказать мой массив по идентификатору продукта (что явно не то, что я просил), или предложения по выполнению ручных запросов sql, что неуместно. Похоже, я не мог правильно описать, что мне нужно, но я попытался сделать это как можно более ясным, извините.

Я наткнулся на решение, пытаясь найти способ «отключить заказ» в торте. Итак, в основном вам нужно иметь массив (назовем его $ queue), где вы сохраняете идентификаторы продуктов, поскольку они добавляются в корзину, а затем в опции «order» в функции поиска (или paginate) вы должны предоставить ему нравится:

'order'=>array('FIELD(Product.id,'.implode(',', $queue).')') 

$ очередь может выглядеть следующим образом, в качестве примера:

[queue] => Array 
     (
      [0] => 51 
      [1] => 1 
      [2] => 11 
     ) 

в конце концов вы получите $ списка массива, в котором порядок продуктов такой же, как в $ queue. Если вы не указали «порядок», то вы получите вам список $ массив как это:

[queue] => Array 
      (
       [0] => 1 
       [1] => 11 
       [2] => 51 
      ) 
0

Я не могу представить простой SQL-запрос, который бы заказывал результаты в соответствии со списком параметров.

Таким образом, самым простым, возможно, является изменение порядка записей после их извлечения из базы данных.

$records = $this->Product->find('all', array('conditions' => array('Product.id' => $products))); 

$sorted_records = array(); 
foreach($records as $record) 
{ 
    $key = array_search($record['Product']['id'], $products); 
    $sorted_records[$key] = $record; 
} 

ksort($sorted_records); 

debug($sorted_records); 
0

Это действительно SQL, не знаю, как сделать CakePHP делают это, но я думаю, что это решит проблему заказа:

SELECT * FROM product WHERE id IN (35, 15, 25) ORDER BY id = 35 DESC, id = 15 DESC, id = 25

0

Если я правильно понимаю, что вы должны заказать результат модели , или, другими словами, установить порядок в запросе для сортировки произвольным образом.

Вот два варианта:

  1. Уточняйте рода. Не знакомы с Cake, но mysql, который вам нужно сгенерировать, это: order by id = 25 desc, id = 70 desc, id = etc (предполагалось, что попробуйте order => 'id = 25 desc, id = 70 desc, id = etc'), который вам нужно будет собрать из массива $products.

  2. создать модель корзины и использовать запрос соединения, чтобы получить список продуктов в правильном порядке (не просто, но, вероятно, лучше, чем полагаться на сеанс var).

Update

я обратил внимание и не помог решить проблему, предоставляя вам с SQL, что вам необходимо для создания, наряду с догадкой в ​​синтаксисе Cake. Глядя на ваше опубликованное решение, ваше ПОЛЕ (id, x, x, x) делает то же самое, но является гораздо более чистым решением. Хорошо сделанный для того, чтобы найти его, я бы удалил ваши комментарии «не значит быть грубыми», хотя они, как правило, кажутся маленькими грубыми.

0

Я не знаком с пирожным или его слоями базы данных, но, возможно, вы можете добавить немного sql.

Соответствующий SQL будет что-то вроде

order by field(myTable.myID, 35, 15, 25) 
-- or alternatively, more cross database compatible 
order by case when myTable.myID = 35 then 1 
       when myTable.myID = 15 then 2 
       when myTable.myID = 25 then 3 
     end 

Однако наиболее универсальным подходом было бы просто изменить порядок в PHP коде.

$products = array(35,15,25);//the ordered array 
$records = array_flip($products); 
foreach ($list as $row) { 
    $id = $row['Product']['id']; 
    $records[$id] = $row; 
} 
print_r($records); 
0

Как я обычно справиться с проблемами, как это путем индексации $ списка по идентификатору продукта с помощью класса Set, который встроен в торт. Так

$list = Set::combine($list, '{n}.Product.id', '{n}.Product'); 

Затем используйте петлю через корзину ($) продукция, которая уже в порядке, вы хотите

foreach($products as $prod) echo $list[$prod]['Product']['name']; 

Надеются, что это помогает.

Смежные вопросы