【问题标题】:PHP Count Similiar Values in multiple arraysPHP计算多个数组中的相似值
【发布时间】:2017-03-04 05:05:48
【问题描述】:

我在数据库中有这样的值:

Row 1 : ["2","3"]
Row 2 : ["1","3"]
Row 3 : ["2","3","4"]

在前端我选择了所有行,现在我想显示相似值的计数。 例如:上述代码中所需的 o/p:计数为 1 = 1 、 2 = 2 、 3 = 3 、 4 = 1

当我 json_decode 上面的值并使用 print_r 时,我得到了这样的结果:

Array ( [0] => 2 [1] => 3 ) 
Array ( [0] => 1 [1] => 3 )
Array ( [0] => 2 [1] => 3 [2] => 4 )

注意:行的列表可以增加,我怎样才能找到相似的值。

我尝试了 array_intersect 如图所示 here ,但没有奏效。

例如:图片在这里 Please Note Data in image, is different from above data

获取上述数据的代码:

    $conn = new mysqli("localhost", "root", "", "ams");
    $query="SELECT * FROM attendance WHERE subject = '$subj'";
    $result = $conn->query($query);


<table class="table table-responsive">
            <tr>
                <th>Sr. No</th>
                <th>Col 1 </th>
                <th>Col 2</th>
            </tr>
            <form method="post">
                <?php
                $i=1;
                    if (mysqli_num_rows($result) > 0) {
                        while ($row=mysqli_fetch_assoc($result)) {

                            $data = $row['att'];
                            $data = json_decode($data);

                            echo "<tr>";
                            echo "<td>" . $i . "</td>";
                            echo "<td>" . $row['date1'] . "</td>";
                            echo "<td>" . print_r($data) . "</td>";
                            echo "</tr>";
                            $i++;
                        }
                    }
                ?>
            </form>
            </table>

【问题讨论】:

  • 我很困惑。你用的是什么数据库?
  • 我正在使用 MYSQL 数据库
  • 您不应该将其作为回应。你用什么驱动来连接Mysql?你能在这个问题中显示一些代码吗?很模糊。
  • 我可以在 PDO 中给你答案吗?我不确定如何利用mysqli_
  • @McStuffins:是的没问题

标签: php arrays


【解决方案1】:

所以,我为你做了这门课。初始化时它将创建连接。

class RowData {

    private $connection;
    private $returnContent = array();
    private $stmt = null;

    function __construct() {
        $connection = new PDO("mysql:host=" . MYSQL_HOST . ";dbname=" . MYSQL_DB, MYSQL_USERNAME, MYSQL_PASSWORD);
        $connection->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
        $connection->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        $this->connection = $connection;
    }

    public function get($subj) {
        $this->getContentFromDB($subj);
        $this->parseContent();
        return $this->returnContent;
    }

    private function getContentFromDB($subj) {
        $stmt = $this->connection->prepare("SELECT * FROM attendance WHERE subject = '{$subj}'");
        $stmt->execute();
        $this->stmt = $stmt;
    }

    private function parseContent() {
        $content = $stmt->fetchAll(PDO::FETCH_OBJ);
        if(count($content) < 1) {
            throw new Exception('Unable to find any attendies');
        }
        foreach($content as $values) {
            $row = $this->getJsonArray($values->att);
            $this->findValues($row);
        }
    }

    private function getJsonArray($content) {
        return json_decode($content);
    }

    private function findValues(array $row) {
        foreach($row as $key => $value) {
            if(isset($this->returnContent[$value])) {
                $this->returnContent[$value] = $this->returnContent[$value] + 1;
            } else {
                $this->returnContent[$value] = 1;
            }
        }
        return;
    }
}

那么,让我解释一下。构造函数将是您编写$x = new RowData(); 时初始化的函数。它创建与 MySQL 数据库的连接。您所要做的就是将 MYSQL_HOST、MYSQL_DB、MYSQL_USERNAME、MYSQL_PASSWORD 值更改为适当的值。唯一可供您公开使用的函数是 get() 函数。 get() 函数调用 2 个单独的函数并接受一个值作为参数。一个值是您所说的$subjget() 函数中的一个函数只是使用您提供的查询从 MySql 表中获取内容。第二个函数parseContent() 从 PDO 获取一个 obj 并循环遍历它。最后,findValues() 函数接受 $row 作为参数。此函数将查看该数字是否已在数据集中。如果是,那么它基本上是一个计数器。否则,它会创建一个新键并将值设置为 1。

get() 函数返回的值是这样的:

array(2=>2, 1=>1, 3=>3, 4=>1)

要使用这个类,你可以这样写:

$rowData = new RowData();
try {
    $content = $rowData->get();
} catch (Exception $e) {
    // No results were found
}

希望这会有所帮助!如果您需要帮助实施此操作,请告诉我,我将非常乐意为您提供帮助!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-13
    • 2020-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多