在 PHP (CodeIgniter) 中的 2 个不同的 foreach 循环中匹配 ID
Matching IDs in 2 different foreach loops in PHP (CodeIgniter)
基本上,我想要实现的是计算每个食品类别的税率。
假设 category number 5
有 tax percentage of 8%
.
所以根据简单的公式计算每个项目的税是:
ITEM COST * TAX % / 100 = Tax Amount
所以我有 2 个数组
数组 1:
Array
(
[0] => Array
(
[5] => 8 // [CATEGORY-ID] => TAX %
)
[1] => Array
(
[22] => 9
)
[2] => Array
(
[32] => 0
)
)
数组 2:
Array
(
[0] => Array
(
[5] => 4.6 // [CATEGORY-ID] => ITEM COST
)
[1] => Array
(
[5] => 10.33
)
[2] => Array
(
[22] => 1.15
)
[3] => Array
(
[32] => 4.59
)
)
table食品类
内部使用的一些子函数get_per_tax_amount()
/**
* GET CATEGORIES-ID FROM ADDED CART ITEM OF THE USER
*/
public function get_category_id_from_cart_item()
{
$cart_items = $this->cart_model->get_all();
$data = array();
foreach ($cart_items as $cart_item) {
$menu_details = $this->menu_model->get_cat_by_menu_id($cart_item['menu_id']);
$data[] = $menu_details['category_id']; //array(1, 2, 2, 3);
}
return array_unique($data); // Array is now unique (1, 2, 3)
}
/**
* GET TAX % FROM CATEGORY-ID
*/
public function get_category_tax_value()
{
$cat_ids = $this->get_category_id_from_cart_item();
$data = array();
foreach ($cat_ids as $cat_id) {
$this->db->select('id,tax');
$this->db->where('id', $cat_id);
$category_data = $this->db->get($this->table)->row_array();
$data[] = array($category_data['id'] => $category_data['tax']);
}
return $data;
}
/**
* GET SMALLER DATA FOR CART PAGE : PER-MENU PRICE
*/
public function get_per_menu_price()
{
$cart_details = $this->get_all();
$data = array();
foreach ($cart_details as $cart_detail) {
$menu_details = $this->menu_model->get_cat_by_menu_id($cart_detail['menu_id']);
$data[] = array($menu_details['category_id'] => $cart_detail['price']);
}
return $data;
}
示例:
public function get_per_tax_amount()
{
$percentages = $this->category_model->get_category_tax_value(); //array 1
$units = $this->cart_model->get_per_menu_price(); //array 2
$total_vat = array();
foreach ($percentages as $cat => $proportion) {
foreach ($units as $unit_cat => $price) {
if($cat == $unit_cat){
$total_vat[] = (floatval($price) * floatval($proportion)) / 100;
}else{
$total_vat[] = (floatval($price) * floatval($proportion)) / 100;
}
}
}
return $total_vat;
}
输出为:
Array
(
[0] => 0.01
[1] => 0.01
[2] => 0.01
[3] => 0.01
[4] => 0.01
[5] => 0.01
[6] => 0.01
[7] => 0.01
[8] => 0.01
[9] => 0.01
[10] => 0.01
[11] => 0.01
)
我不知道为什么会得到这个输出。
所以我的问题是,如何使用 foreach 循环匹配 CATEGORY-ID 并获取每个项目税额?
如果重构输入数组,您可以获得相对简单的算法。目前,您有未分组的数据和一些不必要的级别。这会增加计算税额的函数的复杂性。如果我们将数组重新设计为更合适的格式,我们可以简化函数。
保存每个类别的税收百分比值的数组可以是一个简单的一维数组(因为这里逻辑上不需要重复值),如下所示:
// [CATEGORY-ID] => TAX %
Array
(
[5] => 8
[22] => 9
[32] => 0
)
可以将保存商品价格及其类别的数组制成一个数组,其中顶级键是类别 ID,它们的值是该类别中所有商品价格的子数组,如下所示:
// [CATEGORY-ID] => ITEM COST
Array
(
[5] => Array
(
[0] => 4.6
[1] => 10.33
)
[22] => Array
(
[0] => 1.15
)
[32] => Array
(
[0] => 4.59
)
)
排列整齐的数组,我们现在可以将计算函数简化为:
function get_per_tax_amount() {
$percentages = $this->category_model->get_category_tax_value();
$units = $this->cart_model->get_per_menu_price();
$total_vat = [];
foreach ($units as $unit_cat => $prices) {
foreach ($prices as $price) {
$total_vat[] = $price * $percentages[$unit_cat] / 100;
}
}
return $total_vat;
}
工作原理:
- 我们根本不需要循环百分比数组。我们仅供参考。
- 外循环迭代单位,内循环迭代类别中的所有单价。
- 对于每个价格,我们只需访问百分比数组中等于外循环当前类别键的索引并进行计算。您可能想要添加检查该数组键是否存在于百分比数组中(此代码假定它存在),然后处理这种情况,但最适合您的应用程序(抛出异常,return 空数组... ).
现在,我还没有测试最后一点,但是要实现这些数组结构,我相信您只需要更改以下内容:
- 在
get_category_tax_value()
函数中,更改为:
$data[] = array($category_data['id'] => $category_data['tax']);
对此:
$data[$category_data['id']] = $category_data['tax'];
删除多余的维度。
- 在
get_per_menu_price()
函数中,更改为:
$data[] = array($menu_details['category_id'] => $cart_detail['price']);
对此:
$data[$menu_details['category_id']][] = $cart_detail['price'];
在子数组中添加价格。
基本上,我想要实现的是计算每个食品类别的税率。
假设 category number 5
有 tax percentage of 8%
.
所以根据简单的公式计算每个项目的税是:
ITEM COST * TAX % / 100 = Tax Amount
所以我有 2 个数组
数组 1:
Array
(
[0] => Array
(
[5] => 8 // [CATEGORY-ID] => TAX %
)
[1] => Array
(
[22] => 9
)
[2] => Array
(
[32] => 0
)
)
数组 2:
Array
(
[0] => Array
(
[5] => 4.6 // [CATEGORY-ID] => ITEM COST
)
[1] => Array
(
[5] => 10.33
)
[2] => Array
(
[22] => 1.15
)
[3] => Array
(
[32] => 4.59
)
)
table食品类
内部使用的一些子函数get_per_tax_amount()
/**
* GET CATEGORIES-ID FROM ADDED CART ITEM OF THE USER
*/
public function get_category_id_from_cart_item()
{
$cart_items = $this->cart_model->get_all();
$data = array();
foreach ($cart_items as $cart_item) {
$menu_details = $this->menu_model->get_cat_by_menu_id($cart_item['menu_id']);
$data[] = $menu_details['category_id']; //array(1, 2, 2, 3);
}
return array_unique($data); // Array is now unique (1, 2, 3)
}
/**
* GET TAX % FROM CATEGORY-ID
*/
public function get_category_tax_value()
{
$cat_ids = $this->get_category_id_from_cart_item();
$data = array();
foreach ($cat_ids as $cat_id) {
$this->db->select('id,tax');
$this->db->where('id', $cat_id);
$category_data = $this->db->get($this->table)->row_array();
$data[] = array($category_data['id'] => $category_data['tax']);
}
return $data;
}
/**
* GET SMALLER DATA FOR CART PAGE : PER-MENU PRICE
*/
public function get_per_menu_price()
{
$cart_details = $this->get_all();
$data = array();
foreach ($cart_details as $cart_detail) {
$menu_details = $this->menu_model->get_cat_by_menu_id($cart_detail['menu_id']);
$data[] = array($menu_details['category_id'] => $cart_detail['price']);
}
return $data;
}
示例:
public function get_per_tax_amount()
{
$percentages = $this->category_model->get_category_tax_value(); //array 1
$units = $this->cart_model->get_per_menu_price(); //array 2
$total_vat = array();
foreach ($percentages as $cat => $proportion) {
foreach ($units as $unit_cat => $price) {
if($cat == $unit_cat){
$total_vat[] = (floatval($price) * floatval($proportion)) / 100;
}else{
$total_vat[] = (floatval($price) * floatval($proportion)) / 100;
}
}
}
return $total_vat;
}
输出为:
Array
(
[0] => 0.01
[1] => 0.01
[2] => 0.01
[3] => 0.01
[4] => 0.01
[5] => 0.01
[6] => 0.01
[7] => 0.01
[8] => 0.01
[9] => 0.01
[10] => 0.01
[11] => 0.01
)
我不知道为什么会得到这个输出。
所以我的问题是,如何使用 foreach 循环匹配 CATEGORY-ID 并获取每个项目税额?
如果重构输入数组,您可以获得相对简单的算法。目前,您有未分组的数据和一些不必要的级别。这会增加计算税额的函数的复杂性。如果我们将数组重新设计为更合适的格式,我们可以简化函数。
保存每个类别的税收百分比值的数组可以是一个简单的一维数组(因为这里逻辑上不需要重复值),如下所示:
// [CATEGORY-ID] => TAX %
Array
(
[5] => 8
[22] => 9
[32] => 0
)
可以将保存商品价格及其类别的数组制成一个数组,其中顶级键是类别 ID,它们的值是该类别中所有商品价格的子数组,如下所示:
// [CATEGORY-ID] => ITEM COST
Array
(
[5] => Array
(
[0] => 4.6
[1] => 10.33
)
[22] => Array
(
[0] => 1.15
)
[32] => Array
(
[0] => 4.59
)
)
排列整齐的数组,我们现在可以将计算函数简化为:
function get_per_tax_amount() {
$percentages = $this->category_model->get_category_tax_value();
$units = $this->cart_model->get_per_menu_price();
$total_vat = [];
foreach ($units as $unit_cat => $prices) {
foreach ($prices as $price) {
$total_vat[] = $price * $percentages[$unit_cat] / 100;
}
}
return $total_vat;
}
工作原理:
- 我们根本不需要循环百分比数组。我们仅供参考。
- 外循环迭代单位,内循环迭代类别中的所有单价。
- 对于每个价格,我们只需访问百分比数组中等于外循环当前类别键的索引并进行计算。您可能想要添加检查该数组键是否存在于百分比数组中(此代码假定它存在),然后处理这种情况,但最适合您的应用程序(抛出异常,return 空数组... ).
现在,我还没有测试最后一点,但是要实现这些数组结构,我相信您只需要更改以下内容:
- 在
get_category_tax_value()
函数中,更改为:
$data[] = array($category_data['id'] => $category_data['tax']);
对此:
$data[$category_data['id']] = $category_data['tax'];
删除多余的维度。
- 在
get_per_menu_price()
函数中,更改为:
$data[] = array($menu_details['category_id'] => $cart_detail['price']);
对此:
$data[$menu_details['category_id']][] = $cart_detail['price'];
在子数组中添加价格。