цикл через массив не возвращает правильные значения

Я давно смотрю на это, но не могу понять, что не так. Прежде всего мой код:

//Show the products information line by line
$item_count = 0 ;
for ($i = 0, $n = sizeof($order->products); $i < $n; $i++) {
$data2[$i][0] = $order->products[$i]['qty'];

if (strlen($order->products[$i]['name']) > 40 && strlen($order->products[$i]['name']) < 50){
$data2[$i][1] = $order->products[$i]['name'];
} else if (strlen($order->products[$i]['name']) > 50) {
$data2[$i][1] = substr($order->products[$i]['name'],0,50);
} else {
$data2[$i][1] = $order->products[$i]['name'];
}

$data2[$i][2] = $order->products[$i]['model'];

$data2[$i][3] = str_replace('&nbsp;', ' ',$currencies->format($order->products[$i]['final_price'], true, $order->info['currency'], $order->info['currency_value']));

// Add to $data2 if needed (adjust/renumber subsequent array keys!):

// For VAT purposes:
// Check if product is an 'electronic service'. If so, determine the customer's country.

// NOTE (Debug): the comparison of " pov.products_options_values_name = $order->products[$i]['attributes'][$j]['value'] " only holds if the option description is not changed/replaced/deleted.

if (isset($order->products[$i]['attributes']) && (($k = sizeof($order->products[$i]['attributes'])) > 0)) {
for ($j = 0; $j < $k; $j++) {
$virtual_check_query = tep_db_query("select count(*) as total from " . TABLE_PRODUCTS_ATTRIBUTES . " pa, " . TABLE_PRODUCTS_ATTRIBUTES_DOWNLOAD . " pad, " . TABLE_PRODUCTS_OPTIONS_VALUES . " pov where pa.products_id = '" . $order->products[$i]['id'] . "' and pov.products_options_values_name = '" . $order->products[$i]['attributes'][$j]['value'] . "' and pa.products_attributes_id = pad.products_attributes_id");
$virtual_check = tep_db_fetch_array($virtual_check_query);
if ($virtual_check['total'] > 0) {
$product_type_check = 'virtual';
$order_type_check = 'virtual or mixed';
break;
}
}
}

if ($product_type_check == 'virtual') {
if ($customer_country == 'home country') {
$data2[$i][4] = str_replace('&nbsp;', ' ',tep_display_tax_value($order->products[$i]['tax']) . '%');
} elseif ($customer_country == 'eu country') {
$data2[$i][4] = '***';
} else {
$data2[$i][4] = str_replace('&nbsp;', ' ',tep_display_tax_value($order->products[$i]['tax']) . '%');
}
} else {
$data2[$i][4] = str_replace('&nbsp;', ' ',tep_display_tax_value($order->products[$i]['tax']) . '%');
}

unset($product_type_check);

//      $data2[$i][3] = str_replace('&nbsp;', ' ',$currencies->format($order->products[$i]['final_price'], true, $order->info['currency'], $order->info['currency_value']));

// Add to $data2 if needed (adjust/renumber subsequent array keys!):
//      $data2[$i][5] = str_replace('&nbsp;', ' ',$currencies->format(tep_add_tax($order->products[$i]['final_price'], $order->products[$i]['tax']), true, $order->info['currency'], $order->info['currency_value']));

$data2[$i][5] = str_replace('&nbsp;', ' ',$currencies->format($order->products[$i]['final_price'] * $order->products[$i]['qty'], true, $order->info['currency'], $order->info['currency_value'])) ;

// Add to $data2 if needed (adjust/renumber subsequent array keys!):
//      $data2[$i][5] = str_replace('&nbsp;', ' ',$currencies->format(tep_add_tax($order->products[$i]['final_price'], $order->products[$i]['tax']) * $order->products[$i]['qty'], true, $order->info['currency'], $order->info['currency_value']));// Show the products attributes
$data3 = array();

//get attribs
if (isset($order->products[$i]['attributes']) && (($z = sizeof($order->products[$i]['attributes'])) > 0)) {
$attribute_line = 'true';
for ($m = 0; $m < $z; $m++) {
if ($order->products[$i]['attributes'][$m]['price'] != '0') {
if (strlen('- ' . $order->products[$i]['attributes'][$m]['option'] . ': ' . $order->products[$i]['attributes'][$m]['value'] . ' (' . $order->products[$i]['attributes'][$m]['prefix'] . $currencies->format($order->products[$i]['attributes'][$m]['price'] * $order->products[$i]['qty'], true, $order->info['currency'], $order->info['currency_value']) . ')') > 50) {
$data3[$i][$m][1] = substr('- ' . $order->products[$i]['attributes'][$m]['option'] . ': ' . $order->products[$i]['attributes'][$m]['value'],0,40) . ' (' . $order->products[$i]['attributes'][$m]['prefix'] . $currencies->format($order->products[$i]['attributes'][$m]['price'] * $order->products[$i]['qty'], true, $order->info['currency'], $order->info['currency_value']) . ')';
} else {
$data3[$i][$m][1] = '- ' . $order->products[$i]['attributes'][$m]['option'] . ': ' . $order->products[$i]['attributes'][$m]['value'] . ' (' . $order->products[$i]['attributes'][$m]['prefix'] . $currencies->format($order->products[$i]['attributes'][$m]['price'] * $order->products[$i]['qty'], true, $order->info['currency'], $order->info['currency_value']) . ')' ;
}
} else {
if (strlen('- ' . $order->products[$i]['attributes'][$m]['option'] . ': ' . $order->products[$i]['attributes'][$m]['value']) > 50) {
$data3[$i][$m][1] = substr('- ' . $order->products[$i]['attributes'][$m]['option'] . ': ' . $order->products[$i]['attributes'][$m]['value'],0,50);
} else {
//        $data3[$i][$m][1] = '- ' . $order->products[$i]['attributes'][$m]['option'] . ': ' . $order->products[$i]['attributes'][$m]['value'];
$data3[$i][$m][1] = '- ' . $order->products[$i]['attributes'][$m]['value'];
}
}
}
}
}

Код выше должен:

  • Поместите общие данные продукта в массив $ data2

  • Поместите атрибуты каждого продукта (которых может быть больше одного) в массив $ data3

Массив $ order-> products содержит следующие данные:

Array (

[0] => Array (
[qty] => 1
[id] => 4
[name] => Product A
[model] =>
[tax] => 21.0000
[price] => 19.9900
[final_price] => 19.9900
[attributes] => Array (
[0] => Array (
[option] => Type
[value] => X
[prefix] => +
[price] => 0.0000
)
)
)

[1] => Array (
[qty] => 1
[id] => 4
[name] => Product A
[model] =>
[tax] => 21.0000
[price] => 19.9900
[final_price] => 19.9900
[attributes] => Array (
[0] => Array (
[option] => Type
[value] => Y
[prefix] =>
[price] => 0.0000
)
)
)
)

Код вводит следующие данные в массив $ data3:

Array (
[1] => Array (
[0] => Array (
[1] => - Y
)
)
)

Это означает, что атрибуты первого продукта (Продукт A с ключом 0 в массиве $ order-> products отсутствуют!

Мои интуитивные ощущения говорят мне, что код уже прошел через массив $ order-> products перед выполнением раздела кода «Показать атрибуты продуктов».

Код основан на этом фрагменте, взятом из checkout_confirmation.php (Интернет-магазин):

for ($i=0, $n=sizeof($order->products); $i<$n; $i++) {
echo '          <tr>' . "\n" .
'            <td class="infoBoxMargin">' . tep_draw_separator('pixel_trans.gif', '10', '1') . '</td>' . "\n" .
'            <td class="main" align="left" valign="top" width="10%">' . $order->products[$i]['qty'] . '&nbsp;x</td>' . "\n" .
'            <td class="main" align="left" valign="top" width="60%">' . $order->products[$i]['name'];

if (STOCK_CHECK == 'true') {
echo tep_check_stock($order->products[$i]['id'], $order->products[$i]['qty']);
}

if ( (isset($order->products[$i]['attributes'])) && (sizeof($order->products[$i]['attributes']) > 0) ) {
for ($j=0, $n2=sizeof($order->products[$i]['attributes']); $j<$n2; $j++) {
echo '<br /><nobr><small>&nbsp;<i> - ' . $order->products[$i]['attributes'][$j]['option'] . ': ' . $order->products[$i]['attributes'][$j]['value'] . '</i></small></nobr>';
}
}

Может кто-нибудь объяснить мне, где что-то идет не так?

С уважением,

Деннис

0

Решение

Имея дело с кодом osCommerce в течение многих лет, я должен сказать, что существует много странного кода, и если вы недолго его используете, вам лучше перейти на что-то новое, хотя бы он не использует register_globals. Другая причина перехода заключается в том, что модель MVC отсутствует — вы всегда видите смешанный php-код, HTML-макет и SQL-запросы, особенно в разделе администратора. Другой важной причиной миграции является структура таблиц, или, точнее, отсутствие или неправильные индексы.

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

Теперь к вам вопрос. Я полагаю, что проблема здесь:

$data3 = array();

Каждый раз, когда вы зацикливаете $ order-> products, ваша переменная устанавливается в пустой массив. Таким образом, попытайтесь определить это до вы начинаете перебирать $ order-> products. Например:

$data3 = array();
for ($i = 0, $n = sizeof($order->products); $i < $n; $i++) {
// your code
}

и не забудьте удалить $ data3 = array (); из цикла.

Надеюсь это поможет.

Удачи.

0

Другие решения

Используя ваши образцы данных для $order->products, $order->products[$i]['attributes'][$m]['price'] всегда ноль. Кроме того, так как strlen('- ' . $order->products[$i]['attributes'][$m]['option'] . ': ' . $order->products[$i]['attributes'][$m]['value']) всегда <50, единственный код в //get attribs раздел, который выполняется с вашими примерами данных $data3[$i][$m][1] = '- ' . $order->products[$i]['attributes'][$m]['value']; … вот почему $data3[$i][$m][1] это единственное значение, которое заполняется.

Тем не менее, предполагая, что ваши двое пропали без вести } принадлежат в конце, то $data3 перезаписывается для каждого значения $i по вине $data3 = array(); расположен.

Если вы двигаетесь $data3 = array(); к началу вашего кода (до for loop), вы, по крайней мере, больше не будете перезаписывать значения в $ data3 для каждой версии вашего продукта.

Если вы хотите, чтобы $ data3 содержал копию каждого атрибута, попробуйте изменить $data3[$i][$m][1] = '- ' . $order->products[$i]['attributes'][$m]['value']; в $data3[$i][$m] = $order->products[$i]['attributes'];

1

@ lazy.lizard

Это может быть так просто … если вы знаете, что делаете!

Код теперь начинается с:

$data2=array();
$data3 = array();

//Show the products information line by line
$item_count = 0 ;
for ($i = 0, $n = sizeof($order->products); $i < $n; $i++) {

$data2[$i][0] = $order->products[$i]['qty'];
1
По вопросам рекламы [email protected]