2015-11-25 48 views
0

这里是情况,我从WordPress插件数据库获取数据。我需要从数据库中获取“产品”,找到“名称”值,从中删除一些字符,然后按“名称”长度对其进行排序。这是怎么回事PHP foreach获取表值并更改

//The plug in queries the database 
    $products = $product->getModelsNames($where="", $orderBy='order by name', $limit=null); 

    //I added this to take that query and make changes to the 'name' field 
    foreach ($products as $p) { 

     //Characters I need removed 
     $characters = array("a", "b", "c", "d", ".", "-"); 
     $p->name = str_replace($characters, "", $p->name); 

     //Re sort by name now without characters and save back to $products. not sure what to do here 
    } 

    //now start the loop for the products 
    <?php foreach($products as $p): ?> 

主要的问题是我有产品名称类似:8.2-1, 8.2-2, 8.2-2-A, 8.2-10等等,我不能让他们进行排序的权利。我想唯一的办法是删除所有字符,只是有数字,然后按长度排序,否则我得到我的产品列表如8.2-1, 8.2-10, 8.2-2, 8.2-2-A8.2-1, 8.2-2, 8.2-10, 8.2-2-A。最重要的是,我需要在第二个循环中回显名称,就像在删除字符之前一样。在如何完成这项工作的真正损失。由于产品经常按数字和字符排列,但无法正确排序,看起来很简单。

回答

2

你在找什么叫做自然排序。 PHP has a function for this

$products = array(
    '8.2-10', 
    '8.2-2', 
    '8.2-1', 
    '8.2-2-A' 
); 
natsort($products); 
foreach ($products as $product) { 
    echo $product . "<BR>"; 
} 

输出:

8.2-1 
8.2-2 
8.2-2-A 
8.2-10 

编辑!错过了$ products实际上是一组对象的事实。您可以使用使用strnatcmp不同的技术:

usort($products, function($a, $b) { 
    return strnatcmp($a->name, $b->name); 
}); 

需要注意的是,如果你想保持相同的密钥由于某种原因,只是将其更改为uasort代替。

+0

这不会为我输出任何东西。我是否需要'natsort($ products);'以名字命名? – Packy

+0

啊,我没注意到$产品不仅仅是一系列的名字。我会更新我的答案... – rjdown

+0

完美!我一直在努力研究数小时。谢谢! – Packy