2015-11-25 5 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-A или 8.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 

EDIT! пропустил тот факт, что $ products фактически представляет собой массив объектов. Вы можете использовать другой метод, используя strnatcmp:

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

Обратите внимание, что если вы хотите сохранить те же ключи, по какой-то причине, просто изменить его uasort вместо.

+0

Это не дает мне ничего. У меня есть 'natsort ($ products);' по имени? – Packy

+0

Ах, я не заметил, что $ products больше, чем просто массив имен. Я обновлю свой ответ ... – rjdown

+0

Perfect !!! Я работал часами, пытаясь понять это. Благодаря! – Packy

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