【问题标题】:Problems displaying a PHP array using jquery使用 jquery 显示 PHP 数组的问题
【发布时间】:2018-03-12 20:17:54
【问题描述】:

我在使用 jquery 在 html 中显示数组(可以是 0 到 3 个元素之间)的内容时遇到问题。所有这些都在同一个 php 文件中。

<?php
... other code
$watchlistArray = array();
while ($row = mysqli_fetch_assoc($result)) {
    $watchlistArray[] = $row;
}
?>

数组将包含 0 到 3 个元素。 使用

获得的示例输出
<?php echo json_encode($watchlistArray)?>

2 个结果

[{"prod_id":"41","prod_name":"An old desk","prod_highest_price":"69.30","prod_picture":"2.jpg","prod_end_date":"2018-04-05 20:40:00"},{"prod_id":"58","prod_name":"A brand new Iphone 8!","prod_highest_price":"795.00","prod_picture":"1.jpg","prod_end_date":"2018-09-24 20:40:00"}]

3 个结果

[{"prod_id":"42","prod_name":"A new sofa","prod_highest_price":"153.00","prod_picture":"3.jpg","prod_end_date":"2018-04-06 20:40:00"},{"prod_id":"41","prod_name":"An old desk","prod_highest_price":"69.30","prod_picture":"2.jpg","prod_end_date":"2018-04-05 20:40:00"},{"prod_id":"40","prod_name":"An old chair","prod_highest_price":null,"prod_picture":"2.jpg","prod_end_date":"2018-04-12 20:40:00"}]

现在使用 jquery 和 html 来显示它。

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css">
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
    <script>
        $(document).ready(function () {
            size = <?php echo sizeof($watchlistArray);?>;
            if (size === 0) {
                $('#watchlist0').html('No one has bidded on this item!');
            }

            if (size >= 1) {
                $('#watchlist0').html('                        <a href="../product/productPage.php?prod_ID=<?php echo $watchlistArray[0]["prod_id"]; ?>">\n' +
                    '                            <img src="../Browse/Images/<?php echo $watchlistArray[0]["prod_picture"] ?>"\n' +
                    '                                 class="img-rounded img-responsive">\n' +
                    '                        </a>\n' +
                    '                        <h4><?php echo $watchlistArray[0]["prod_name"] ?></h4>\n' +
                    '                        Current price: <strong><?php echo $watchlistArray[0]["prod_highest_price"] ?></strong>');
            }

            if (size >= 2) {
                $('#watchlist1').html('                        <a href="../product/productPage.php?prod_ID=<?php echo $watchlistArray[1]["prod_id"]; ?>">\n' +
                    '                            <img src="../Browse/Images/<?php echo $watchlistArray[1]["prod_picture"] ?>"\n' +
                    '                                 class="img-rounded img-responsive">\n' +
                    '                        </a>\n' +
                    '                        <h4><?php echo $watchlistArray[1]["prod_name"] ?></h4>\n' +
                    '                        Current price: <strong><?php echo $watchlistArray[1]["prod_highest_price"] ?></strong>');
            }

            if (size >= 3) {
                alert ("case 3")
                $('#watchlist2').html('                        <a href="../product/productPage.php?prod_ID=<?php echo $watchlistArray[2]["prod_id"]; ?>">\n' +
                    '                            <img src="../Browse/Images/<?php echo $watchlistArray[2]["prod_picture"] ?>"\n' +
                    '                                 class="img-rounded img-responsive">\n' +
                    '                        </a>\n' +
                    '                        <h4><?php echo $watchlistArray[2]["prod_name"] ?></h4>\n' +
                    '                        Current price: <strong><?php echo $watchlistArray[2]["prod_highest_price"] ?></strong>');
            }
        })
    </script>

<body>
<div class="container">
    <div class="row">
        <div class="col-sm-4" align="center" id="watchlist0">
        </div>
        <div class="col-sm-4" align="center" id="watchlist1">
        </div>
        <div class="col-sm-4" align="center" id="watchlist2">
        </div>
    </div>
</div>
</body>
</html>

我已经尝试过几种不同的方法(使用 switch 语句、循环等),但我总是遇到同样的问题。该信息仅在数组中有 3 个元素时显示。如果我取出在 size >=3 时运行的代码,那么当同时存在 3 个和 2 个元素时,我会得到 2 张图像和其他信息。这真的很奇怪,我已经尝试了几个小时 - 请帮助一个苦苦挣扎的学生。

更新

谢谢大家的建议。由于输出是静态的,我在 php 中使用带有 html 回显的 switch 语句实现了这一点。

<?php
$arrSize = sizeof($watchlistArray);
switch ($arrSize) {
    case 0:
        echo "case 0 HTML";
        break;

    case 1:
        echo 'case 1 HTML';
        break;

    case 2:
        echo 'case 3 HTML';
        break;

    case 3:
        echo 'case 3 HTML';
}
?>

这可能不是最有效的方法(因为每个回显都引用相同的 HTML 元素)但它确实有效!

【问题讨论】:

  • 你为什么要混合使用php和javascript,输出似乎是静态的并且取决于php变量的值,所以似乎不需要javascript。
  • 我建议您查看浏览器接收到的由 php.ini 生成的源代码。您甚至可以在上面更新您的问题。
  • @jeroen 我这样做了,效果很好。谢谢

标签: javascript php jquery arrays


【解决方案1】:

即使您解决了问题 - 正如我刚刚看到的那样,我也会发布我的答案。也许它可以帮助你进一步。我不能 100% 确定您在这些条件下试图达到什么目的,但我认为您希望为 $watchlistArray 中找到的每个产品显示一个 col-sm-4 div。

确实,不需要 js,除非您正在执行 ajax 请求以从数据库中获取数据。请注意,在我的代码中,我将变量 $watchlistArray 的名称更改为 $products,因为我发现它更适合我。原则上,代码会读取产品列表中的所有产品并将它们显示在 col-sm-4 单元格中。如果产品列表中的产品数量超过了可在一行中显示的最大产品数量(在您的情况下为 3),则会创建一个新行。您可以按原样运行代码。

注意:尽量避免在 js 代码中使用 php 结构。 php 变量值可以作为参数传递给 js 函数,可以在 html 元素的事件属性(onclick、onload 等)上调用。

<?php
// This is just a hard-coded list. Build it as you wish (with db data for example).
$products = [
    [
        'prod_id' => '42',
        'prod_name' => 'A new sofa',
        'prod_highest_price' => '153.00',
        'prod_picture' => '3.jpg',
        'prod_end_date' => '2018-04-06 20:40:00'
    ],
    [
        'prod_id' => '41',
        'prod_name' => 'An old desk',
        'prod_highest_price' => '69.30',
        'prod_picture' => '2.jpg',
        'prod_end_date' => '2018-04-05 20:40:00'
    ],
    [
        'prod_id' => '40',
        'prod_name' => 'An old chair',
        'prod_highest_price' => null,
        'prod_picture' => '2.jpg',
        'prod_end_date' => '2018-04-12 20:40:00'
    ],
    [
        'prod_id' => '57',
        'prod_name' => 'An interesting book',
        'prod_highest_price' => '18.86',
        'prod_picture' => '2.jpg',
        'prod_end_date' => '2018-04-21 15:18:23'
    ],
    [
        'prod_id' => '58',
        'prod_name' => 'A big apple',
        'prod_highest_price' => '12.19',
        'prod_picture' => '2.jpg',
        'prod_end_date' => '2018-04-23 03:09:55'
    ],
];
?>
<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" />
        <meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=yes" />
        <meta charset="UTF-8" />
        <!-- The above 3 meta tags must come first in the head -->

        <title>Demo</title>

        <!-- CSS resources -->
        <link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" type="text/css" rel="stylesheet" />

        <!-- JS resources -->
        <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
        <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js" type="text/javascript"></script>

        <style type="text/css">
            .row {
                padding-top: 20px;
                padding-bottom: 20px;
                border-bottom: 1px solid #ccc;
            }

            .product {
                text-align: center;
            }
        </style>
    <body>

        <div class="container">
            <?php
            if (isset($products) && $products) {
                $numberOfProductsPerRow = 3; /* How many products should be allowed in a row? */
                $numberOfDisplayedProductsPerRow = 0; /* How many products are already displayed in a row? */

                foreach ($products as $key => $product) {
                    $productId = $product['prod_id'];
                    $productPicture = $product['prod_picture'];
                    $productName = $product['prod_name'];
                    $productHighestPrice = $product['prod_highest_price'];

                    if ($numberOfDisplayedProductsPerRow % $numberOfProductsPerRow === 0) {
                        ?>
                        <div class="row">
                            <?php
                        }
                        ?>
                        <div class="col-sm-4 product" id="product<?php echo $key; ?>">
                            <a href="../product/productPage.php?prod_ID=<?php echo $productId; ?>">
                                <img src="../Browse/Images/<?php echo $productPicture; ?>" class="img-rounded img-responsive" alt="<?php echo $productName; ?>">
                            </a>

                            <h4>
                                <?php echo $productName; ?>
                            </h4>

                            <div>
                                Current price: <span class="highest-price"><?php echo $productHighestPrice; ?></span>
                            </div>
                        </div>
                        <?php
                        $numberOfDisplayedProductsPerRow++;

                        if ($numberOfDisplayedProductsPerRow === $numberOfProductsPerRow) {
                            $numberOfDisplayedProductsPerRow = 0;
                            ?>
                        </div>
                        <?php
                    }
                }
            } else {
                ?>
                <div class="row">
                    <div class="col-sm-12">
                        No one has bidded on this item!
                    </div>
                </div>
                <?php
            }
            ?>
        </div>

    </body>
</html>

【讨论】:

  • 我更喜欢这种方式,而不是我这样做的方式,而且我也学到了一些新东西。谢谢!
  • @AakashBhalla 欢迎您。我很高兴能帮助你,尤其是你可以从我的回答中学到新东西。提示:您可以在动态构建行/单元格时应用 modulo 操作。祝你好运。
【解决方案2】:

您的条件重叠..

if(size>=2) 

if(size>=3) 

当有 3 个元素时都将被调用.. 尝试将它们替换为

if(size==2)
...........
if(size>=3)

【讨论】:

  • 我认为这不是问题,因为 (size == 0) 也不起作用。例如: 返回 []。 size ==0 不起作用。
  • 您的条件是检查 size if (size === 0) 检查值是否为 0 以及 size 是否为整数...尝试 if (size == 0) 或 if size === "0"
  • 您应该注意到,即使条件重叠,结果 也是正确的,因为索引是硬编码的。注意 if (size >= 1) 中的代码如何调用数组的 [1] 键?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-06-20
  • 2011-03-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多