PHP计算多个数组中的熟悉值

时间:2017-03-04 05:05:49

标签: php arrays

我在数据库中有这些值:

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 )

注意:可以增加行列表,如何找到相似的值。

我尝试了如here所示的array_intersect,但没有效果。

例如:图像在这里 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>

1 个答案:

答案 0 :(得分:0)

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

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
}

希望这有帮助!如果您需要帮助实现这一点,请告诉我,我将非常乐意帮助您!