Я застрял на том, как считать элементы в моем массиве
Код
// Product ID's to Search
$deposit_items = array( '4359', '4336', '4331', '4320' );
// Loop through the Cart Items
foreach ( $cart_object->get_cart() as $item_values ) {
// Check if the cart contains items with the matching Product ID's
if( in_array( $item_values['product_id'], $deposit_items )) {
// Count number of products in Cart that have matching Product ID's
}
}
Мне нужно вернуть количество элементов в массиве, которые имеют идентификаторы продуктов, как указано в $deposit_items
Что-то вроде этого
// Product ID's to Search
$deposit_items = array( '4359', '4336', '4331', '4320' );
$cart_items = $cart_object->get_cart();
$cart_product_ids = array_column($cart_items, 'product_id');
$count = count(array_intersect($cart_product_ids, $deposit_items ));
Например
// Product ID's to Search
$deposit_items = array( '4359', '4336', '4331', '4320' );
$cart_items = [
['product_id' => 4359],
['product_id' => 4320]
];
$cart_product_ids = array_column($cart_items, 'product_id');
echo count(array_intersect($cart_product_ids, $deposit_items ));
Выход
2
Это может быть сжато (Golfed) в одну строку, как это:
$deposit_items = array( '4359', '4336', '4331', '4320' );
echo count(array_intersect(array_column($cart_object->get_cart(),'product_id'),$deposit_items));
Для справки
http://php.net/manual/en/function.array-column.php
http://php.net/manual/en/function.array-intersect.php
Столбец Array, берет этот большой многомерный массив и перезапускает один столбец, используя мой (несколько простой) пример:
$cart_items = [
['product_id' => 4359],
['product_id' => 4320],
['product_id' => 333]
];
Становится (я добавил 333, только для ударов ногами)
[4359, 4320, 333]
В основном тот же формат, что и ваш $deposit_items
, Как только они совпадают, мы можем использовать массив пересечений, чтобы найти все элементы в массиве 1, которые появляются во втором массиве. В этом случае мы хотим, чтобы вышеуказанные элементы массива, только если они находятся в $deposit_items
, Как только у нас есть те, это просто подсчитать их со счетом.
Просто чтобы проиллюстрировать это дальше
print_r([
['product_id' => 4359],
['product_id' => 4320],
['product_id' => 333]
], 'product_id');
Выход
[4359, 4320, 333]
затем
print_r(array_intersect([4359, 4320, 333], ['4359', '4336', '4331', '4320']));
Выход
[4359, 4320]
И тогда счет довольно прямолинеен.
Другие вещи
По совпадению, если вы хотите сделать обратное, считайте элементы НЕ в $deposit_items
вы бы просто заменили array_intersect
с array_diff
,
echo count(array_diff(array_column($cart_items, 'product_id'), $deposit_items ));
И если вы перевернете массивы с помощью массива diff, вы получите количество депозитных предметов, НЕ находящихся в корзине.
echo count(array_diff($deposit_items, array_column($cart_items, 'product_id')));
Ура!
Пытаться
$count = 0;
foreach ( $cart_object->get_cart() as $item_values ) {
// Check if the cart contains items with the matching Product ID's
if( in_array( $item_values['product_id'], $deposit_items )) {
// Count number of products in Cart that have matching Product ID's
$count++;
}
}
// Display
echo 'total number of matched items: ' , $count;
Если я правильно понял, что ваш $item_values['product_id']
это сам массив, вы можете попробовать что-то вроде:
$deposit_items = array( '4359', '4336', '4331', '4320' );
foreach ( $cart_object->get_cart() as $cart_items ){
foreach ( $cart_items['product_id'] as $arr_values ){
if ( in_array($arr_values, $deposit_items)){
// Count number of products in Cart that have matching Product ID's
}
}
}
Этот парень хочет получить количество товаров в магазине, поэтому это решение.
<?php
global $woocommerce;
$items = $cart_object->cart->get_cart();
foreach($items as $item => $values) {
$_product = wc_get_product( $values['data']->get_id());
echo "<b>".$_product->get_title().'</b> <br> Quantity: '.$values['quantity'].'<br>';
$price = get_post_meta($values['product_id'] , '_price', true);
echo " Price: ".$price."<br>";
}
?>