PHP, MYSQL, взорваться и массивы - PullRequest
1 голос
/ 02 ноября 2010
$query_posts = "
SELECT DISTINCT meta_value
FROM $wpdb->posts wposts, $wpdb->postmeta wpostmeta
WHERE wposts.ID = wpostmeta.post_id
AND wpostmeta.meta_key = 'Product'
AND wposts.post_status = 'publish'
AND wposts.post_type = 'post'
ORDER BY wposts.post_date DESC";

$result = mysql_query($query_posts) or die(mysql_error());
while($row = mysql_fetch_array($result)){
    echo $row['meta_value'];
}

Выше приведен список результатов, как показано ниже:

235/40/R18/95/ZR(Y)/XL £180.00
225/45/R17/94/W/XL £180.00
235/45/R17/97/Y/XL £180.00
245/45/R17/99/Y/XL £180.00
245/40/R17/91/Y £180.00
225/40/R18/92/W/XL £180.00
etc etc

Это размеры шин, если вы не догадались. Мне нужно разбить первые три значения на отдельные реляционные меню: Trye Width / Sidewall / Rim

Я понял, что если я использую:

$query_posts = "
SELECT DISTINCT meta_value
FROM $wpdb->posts wposts, $wpdb->postmeta wpostmeta
WHERE wposts.ID = wpostmeta.post_id
AND wpostmeta.meta_key = 'Product'
AND wposts.post_status = 'publish'
AND wposts.post_type = 'post'
ORDER BY wposts.post_date DESC";
$result = mysql_query($query_posts) or die(mysql_error());
while($row = mysql_fetch_array($result)){
    $tyres_widths = (explode("/",$row['meta_value']));
    echo ($tyres_widths[0]); 
}

Я могу получить первый ($ tyres_widths [0]), второй ($ tyres_widths [1]) или третий столбец ($ tyres_widths [2]), но значения не различаются и, конечно, я до сих пор не дошел до точка, когда они являются реляционными в меню.

Мой подход правильный? Должен быть лучший метод? Может ли кто-нибудь помочь. Я рад вознаграждению за правильный ответ, и, конечно, кто-то другой может получить пользу, в этом весь смысл !! ​​

Заранее спасибо

Stu

Ответы [ 3 ]

2 голосов
/ 02 ноября 2010

Ваш подход правильный.Обратите внимание, что вы можете использовать list для "распаковки" массива:

list($width, $sidewall, $rim) = explode("/",$row['meta_value']);

Переменная с именем $sidewall более понятна, чем переменная с именем $tire_widths[1].

РЕДАКТИРОВАТЬ

Еще более аккуратно, вы можете поместить поля обратно в ассоциативный массив, используя:

list($tires['width'], 
     $tires['sidewall'], 
     $tires['rim'])      = explode("/",$row['meta_value']);

EDIT

Для каждого запроса в комментарии, чтобы создать список отдельных значений для определенного поля, вам нужно будет создать отдельный массив и использовать array_unique:

$result = mysql_query($query_posts) or die(mysql_error());
$ar_widths = array(); // setup array of widths

while($row = mysql_fetch_array($result)){
    list($width, $sidewall, $rim) = explode("/",$row['meta_value']);

    $ar_widths[] = $width; // remember width
}

$ar_widths = array_unique($ar_widths); // remove duplicates
print_r($ar_widths);
0 голосов
/ 02 ноября 2010

Вы можете использовать функцию «array_unique» для удаления дублирующихся элементов из массива.

0 голосов
/ 02 ноября 2010

другим подходом были бы регулярные выражения, хотя я бы не рекомендовал его, потому что он довольно "ресурсный" ресурс, что вы можете сделать, это взобраться на массив и назвать массив, когда он взбирается используя функции как первый, следующий, конец

Вы можете найти поведение различных функций на php.net/next alt. php.net/ имя функции

p.s. надеюсь, это помогло

$array = (explode("/",$row['meta_value']));
$tires['width']= first($array);
$tires['height']= next($array);
$tires['depth']= next($array);

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

возвращает false.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...