【问题标题】:Add additional values in an array在数组中添加附加值
【发布时间】:2015-12-20 14:30:53
【问题描述】:

(这篇文章可能会很长,但请耐心等待并帮助我找到解决方案)

我有一个包含各种参数的产品表,主要参数是它的大小和成本。每个产品尺寸分为小、中、大三部分,其成本也根据产品的尺寸进一步分为三部分。为此,我创建了另一个表 productsize,其中包含每个产品的尺寸和成本。

prodsize 表的小视图是

我有另一个桌子购物车,它保存着用户订购的那些产品的价值

购物车表小视图

现在我希望合并这两个表,并创建一个数组来显示每个尺寸的尺寸以及用户为特定产品的每个尺寸订购的数量。为此,我编写了下面的代码

$sql = "SELECT catname,GROUP_CONCAT(prodsize) as sizes,GROUP_CONCAT(cost) as price,prodname,prodimg,catid,productid FROM productsize where catid='".$catid."' group by productid";
    $result = mysqli_query($con, $sql);
    if (mysqli_num_rows($result) > 0) 
        {
            while($row = mysqli_fetch_assoc($result))
                {
                    $pid=$row['productid'];
                    $rows['catname'] = $row['catname'];
                    $rows['sizes'] = $row['sizes'];
                    $rows['price'] = $row['price'];
                    $rows['prodname'] = $row['prodname'];
                    $rows['prodimg'] = $row['prodimg']; 
                    $rows['catid'] = $row['catid'];     
                    $rows['productid'] = $row['productid'];

                    $user_sql = "SELECT group_concat(prodsize) as purchased_size,group_concat(quantity) as purchased_quantity,catid,userid FROM `cart` where userid='$userid' and catid='$catid' and productid='$pid'";

                    $user_result = mysqli_query($con, $user_sql);
                    if (mysqli_num_rows($user_result) > 0) 
                        {   
                            while($user_row = mysqli_fetch_assoc($user_result))
                                {
                                    $rows['purchased_size'] = $user_row['purchased_size'];
                                    $rows['purchased_quantity'] = $user_row['purchased_quantity'];
                                    $rows['userid'] = $user_row['userid'];
                                }
                        }

                    $post_rows[]=$rows;     
                }       
                echo "<pre>";
                print_r($post_rows);
                echo "</pre>";
        }

我通过 print_r($post_rows) 得到的数组是

Array
(
    [0] => Array
        (
            [catname] => Main Course
            [sizes] => small,medium,large
            [price] => 130,170,200
            [prodname] => pies
            [prodimg] => 
            [catid] => 2
            [productid] => 13
            [purchased_size] => small,large
            [purchased_quantity] => 1,1
            [userid] => 1
        )

    [1] => Array
        (
            [catname] => Main Course
            [sizes] => small,medium,large
            [price] => 50,90,110
            [prodname] => Squash
            [prodimg] => 
            [catid] => 2
            [productid] => 14
            [purchased_size] => medium
            [purchased_quantity] => 1
            [userid] => 1
        )

    [2] => Array
        (
            [catname] => Main Course
            [sizes] => small,medium
            [price] => 70,110
            [prodname] => corns
            [prodimg] => 
            [catid] => 2
            [productid] => 15
            [purchased_size] => 
            [purchased_quantity] => 
            [userid] => 
        )
)

现在我想要的更改在 [purchased_size][purchased_quantity] 中。我要那个 如果用户没有为特定产品购买任何东西,那么[purchased_size][purchased_quantity] 中的值应该为 0,0,0,如果用户购买了一种尺寸的产品,如 Squash 的情况,用户选择中等那么 [purchased_size] 和 [purchased_quantity] 中的其他值应该为 0,0,如果他订购了 2 个尺寸,则 [purchased_size] 和 [purchased_quantity] 中的第三个值应该为 0

所以新数组应该看起来像下面给出的数组(IMP 点,大小和成本的顺序应该是固定的,即小、中、大)

Array
(
    [0] => Array
        (
            [catname] => Main Course
            [sizes] => small,medium,large
            [price] => 130,170,200
            [prodname] => pies
            [prodimg] => 
            [catid] => 2
            [productid] => 13
            [purchased_size] => small,0,large
            [purchased_quantity] => 1,0,1
            [userid] => 1
        )

    [1] => Array
        (
            [catname] => Main Course
            [sizes] => small,medium,large
            [price] => 50,90,110
            [prodname] => Squash
            [prodimg] => 
            [catid] => 2
            [productid] => 14
            [purchased_size] => 0,medium,0
            [purchased_quantity] => 0,1,0
            [userid] => 1
        )

    [2] => Array
        (
            [catname] => Main Course
            [sizes] => small,medium
            [price] => 70,110
            [prodname] => corns
            [prodimg] => 
            [catid] => 2
            [productid] => 15
            [purchased_size] => 0,0,0
            [purchased_quantity] => 0,0,0
            [userid] => 
        )

)

【问题讨论】:

  • 我只是不知道你为什么首先使用 GROUP_CONCAT() 。直接在 PHP 中处理非聚合数组似乎更容易
  • @Strawberry 能否请您提出一种我可以使用的方法

标签: php mysql sql arrays multidimensional-array


【解决方案1】:

这里的问题在于您做事的方式,最终您会遇到一些麻烦,因为您正在处理从数据库中获取的数据并重新格式化以适应用途的细微差别,而不仅仅是存储和检索数据首先是正确的方法。

理想情况下,您正在处理的每种产品/尺寸的产品表中都应该有单独的产品 ID,这样您就可以跟踪库存水平等,并在购物车/购物篮场景中处理每个有形物品的数量……无论如何,直接回答您的问题问题,此代码会根据您的特定目的进行转换:

$rows['sizes'] = 'small,medium,large';
$available_sizes = explode(',', $rows['sizes']);
$rows['purchased_size'] = 'medium';
$purchased_sizes = explode(',', $rows['purchased_size']);
$rows['purchased_quantity'] = 1;
$purchased_quantity = explode(',', $rows['purchased_quantity']);

echo '<pre>';
echo '$purchased_sizes: ' . print_r($purchased_sizes, true);
echo '</pre>';
echo '<pre>';
echo '$purchased_quantity: ' . print_r($purchased_quantity, true);
echo '</pre>';

$rows['purchased_size'] = '';
$rows['purchased_quantity'] = '';
foreach ($available_sizes as $key => $size) {
    $rows['purchased_size'] .= in_array($size, $purchased_sizes) ? $size : 0;
    $rows['purchased_quantity'] .= in_array($size, $purchased_sizes) ? array_shift($purchased_quantity) : 0;
    if ($key != count($available_sizes)-1) {
        $rows['purchased_size'] .= ',';
        $rows['purchased_quantity'] .= ',';
    }
}

echo '<pre>';
echo '$rows[purchased_size]: ' . print_r($rows['purchased_size'], true);
echo '</pre>';
echo '<pre>';
echo '$rows[purchased_quantity]: ' . print_r($rows['purchased_quantity'], true);
echo '</pre>';

上面的输出:

$purchased_sizes: Array
(
    [0] => medium
)
$purchased_quantity: Array
(
    [0] => 1
)
$rows[purchased_size]: 0,medium,0
$rows[purchased_quantity]: 0,1,0

【讨论】:

  • 但是看看这变得多么复杂,您需要认真重新考虑您的数据存储和整体策略。拿起笔和纸,把它分解成更简单、更合乎逻辑的东西。
  • 我明白你的意思,它变得很复杂,我遇到了一个与我的非常相似的问题,但它也没有答案,如果你能通过它,将不胜感激。链接是:stackoverflow.com/questions/32758649/…
  • @Sam 好的,我会的。您介意投票并单击勾号以接受我的回答吗?我已经证明它回答了这个问题,非常感谢。
  • 为什么这个答案得到了 2 票反对?帮助提出问题的人,也有助于说明这不是做事的最佳方式......
猜你喜欢
  • 2021-05-03
  • 2017-06-05
  • 2013-10-25
  • 1970-01-01
  • 2016-04-24
  • 1970-01-01
  • 2022-11-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多