Php 如何对保留初始状态的数组进行排序

Php 如何对保留初始状态的数组进行排序,php,cakephp,Php,Cakephp,在这里使用CakePHP2.0。标题有点误导,所以要澄清一下-我有一个会话数组,当用户将产品添加到购物车时,它会填充产品ID。所以这个数组类似于[0]=>25、[1]=>70等等。假设这个数组被称为$products 我想问的是,是否有可能让我使用“find”模型函数(“conditions”=>array('Product.id'=>$products))得到的数组不是按一些model.field值(如“order”选项)排序,而是按$products数组索引排序,这样,当我呈现视图中的产品内

在这里使用CakePHP2.0。标题有点误导,所以要澄清一下-我有一个会话数组,当用户将产品添加到购物车时,它会填充产品ID。所以这个数组类似于[0]=>25、[1]=>70等等。假设这个数组被称为$products

我想问的是,是否有可能让我使用“find”模型函数(“conditions”=>array('Product.id'=>$products))得到的数组不是按一些model.field值(如“order”选项)排序,而是按$products数组索引排序,这样,当我呈现视图中的产品内容时,我将按照用户添加产品时的顺序对购物车中的所有产品进行排序

这里有一个例子- 会话阵列$产品:

[0] => 35,
[1] => 15,
[2] => 25
然后我将此数组传递给find函数的条件:

$list = $this->Product->find('all', array('conditions' => array('Product.id' => $products)));
在最后,$list给出了按product.id排序的数组。因此,我们没有:

[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 ))
到目前为止,所有的答案都不能解决我的问题。请密切注意我给出的示例,它非常简单,但提供的答案是不同的


同样,我需要最后一个数组$list按会话数组$products的索引排序,但是我得到了按Product.id字段排序的$list,即使我没有指定任何
'find(数组('order'=>…)“
,甚至试图将其设置为false。

我想不出一个简单的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);

这是有效的SQL,不确定如何使cakephp呈现它,但我认为它将解决您的排序问题:



如果我理解正确,请选择*FROM product,其中id IN(35,15,25)ORDER BY id=35 DESC,id=15 DESC,id=25

如果我理解正确,您需要对模型结果进行排序,或者换句话说,在查询中设置一个顺序以任意方式排序

这里有两个选项:

  • 指定排序。不熟悉Cake,但您需要生成的mysql是:
    orderbyid=25desc,id=70desc,id=etc
    (我猜您应该试试
    order=>'id=25desc,id=70desc,id=etc'
    ),您必须从
    $products
    数组中组装它

  • 创建一个篮子模型并使用连接查询以正确的顺序获取产品列表(不简单,但可能比依赖会话变量要好)

  • 更新


    我已经注意到并修复了您的问题,为您提供了生成所需的SQL,以及对蛋糕语法的猜测。查看您发布的解决方案,您的字段(id,x,x,x)也在做同样的事情,但它是一个更干净的解决方案。做得好,找到它,我会删除你的“不想粗鲁”的评论,虽然他们通常看起来有点粗鲁

    我不熟悉cake或其数据库层,但也许您可以添加一点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);
    

    我通常处理此类问题的方法是使用内置于Cake中的Set类,通过产品ID为$list编制索引。所以

    $list = Set::combine($list, '{n}.Product.id', '{n}.Product');
    
    然后使用循环遍历您的购物车($products),它已经按照您想要的顺序进行了

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

    希望这能有所帮助。

    我不想听起来粗鲁,但对我的问题的所有回答都是关于如何按产品id对阵列排序(这显然不是我所要求的),或者关于执行不合适的手动sql查询的建议。似乎我无法恰当地描述我需要什么,但我尽量把它说清楚,对不起

    在试图找到如何在蛋糕中“禁用顺序”时,我偶然发现了一个解决方案。因此,基本上您需要做的是创建一个数组(我们称之为$queue),在将产品ID添加到购物车时,在其中保存产品ID,然后在find model函数(或paginate)中的“order”选项中,您应该提供如下内容:

    'order'=>array('FIELD(Product.id,'.implode(',', $queue).')')
    
    $queue可能如下所示,例如:

    [queue] => Array
            (
                [0] => 51
                [1] => 1
                [2] => 11
            )
    
    最后,您将得到$list数组,其中产品的顺序与$queue中的顺序相同。如果未指定“order”,则会得到如下数组:

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

    我无法理解这个问题,但我想这可能会有所帮助……您无法对保留初始状态的数组进行排序(因为您可以对其进行排序),但您可以将其存储两次,甚至更好。您可以将数组的索引存储在初始状态,这样您就可以在需要时按初始状态(或相反)对数组进行排序$初始_状态_索引=数组_键(_数组);同意,这个问题有点模糊。。。试着用代码来阐明你的观点,或者从另一个角度来阐述我根本没有使用“顺序”。正如我所说的,会话数组$products包含产品ID,其中索引(从[0]等)表示用户添加的产品序列。我不确定您为什么提出“订单”,没有其他人提到它。“(如‘订单’选项中所述),“因此,当我提交订单内容时”。我注意到,正如我所说的,您最初的帖子非常模糊。当我看到它时,我做出了回应,以说明我发现它是多么模糊。现在,您已经添加了我建议的更改,您已经得到了4个答案和我的最后一条评论,作为潜在的解决方案,比其他情况下要多。没有必要粗鲁无礼。你有没有尝试过任何提供的解决方案,或者你只是回去争论一个没有实际意义的问题?