如何在PHP中将元素添加到多维数组?

3
我在论坛和其他网站上做了一些关于这个问题的研究,但我似乎无法解决它。
我的代码中一个函数的目标是为现有用户添加5个声望点数,如果用户不存在,则创建一个声望值为“1”的新用户。用户将在表单中输入用户名和ID号码,然后该信息将被发送到我的PHP脚本。该功能使用该信息来实现它的魔力,但输出结果是错误的。
我得到的是一个声望值为“6”的新用户。我省略了一些与此问题无关的脚本。
任何帮助或建议将不胜感激。
<html>

<head></head>

<body>
<div align="center">
<?php

// Array begin 
$karma_score = array(   array("Userid" => 1, "NameID" => 'Doe', "Karma" => 45, "LastLogin" => "2012-08-30"),
                        array("Userid" => 2, "NameID" => 'Smith', "Karma" => 123, "LastLogin" => "2012-09-02"),
                        array("Userid" => 3, "NameID" => 'Chan', "Karma" => 1, "LastLogin" => "2011-12-23"),
                        array("Userid" => 4, "NameID" => 'Zee', "Karma" => 15, "LastLogin" => "2012-07-01"));

// Counter for amount of users
$counter = count($karma_score);

// Function to print general array
function printArray($a){
    echo '<table border="1px">';
    echo '<tr>';
        foreach(array_keys($a[0]) as $head){
            echo '<th>'.$head.'</th>';
        }
    echo '</tr>';

    foreach($a as $b) {
    echo '<tr>';
        echo '<td>'.$b['Userid'].'</td>';
        echo '<td>'.$b['NameID'].'</td>';
        echo '<td>'.$b['Karma'].'</td>';
        echo '<td>'.$b['LastLogin'].'</td>';
    echo '</tr>';
    }
    echo '</table>';
}

echo '<br>';

function findInfo()
{
    global $karma_score;
    $counter = count($karma_score);

        foreach ($karma_score as $key => $b) {
            if ($b['NameID'] === $_POST['name'])
                $karma_score[$key]["Karma"] += 5;
            else 
                $karma_score[$counter+1] = array("Userid" => $_POST['id'], "NameID" => $_POST['name'], "Karma" => 1, "LastLogin" => date("Y-m-d"));     
        }
    echo "<br> Here is your updated table.";
    printArray($karma_score);
}

if (isset($_POST['submit'])) {
    findInfo();
}

?>

<br>


Please enter name and id. If name exists, add 5. If not, add user.
<form action="" method="POST">
    Name: <input type="text" name="name" placeholder="Enter Name Here">
    ID: <input type="text" name="id" placeholder="Enter ID #">
    <input type="submit" name="submit">


</div>
</body>

</html>

以下是我的输出结果:当我点击提交时(我输入的用户为“Alec”,ID为“5”),第四个表格就是我所得到的。提前感谢您!
编辑:当我提交一个已在数组中的用户时,会发生什么情况。我想要的结果是,用户的Karma分数简单地增加5分。

你在这段小代码中做了什么自己的事情吗?第三个?第四个问题? - user557846
@Dagon,这样做很不成熟也不专业。正如我之前提到的,这只是我的一小部分代码。对于打扰你并给你带来压力,我深感抱歉。我们并不像你一样都是出色的程序员。 - Alec L. Kleyer
3个回答

3

完全可以,你的循环总是比较NameID,如果不匹配,就会将元素添加到数组中,而元素NameID的值并不总是与您要查找的值相同。在您的循环中,已经三次向元素数组中添加了(在值不匹配时,在这种情况下,您提交了存在的值)具有相同键[5] ($count + 1)的元素。 因此,您可以创建一个变量来表示您提交的值已存在。

function findInfo(){
    global $karma_score;
    $counter = count($karma_score);
    $isExist = false;
    foreach ($karma_score as $key => $b) {
        if ($b['NameID'] === $_POST['name']){
            $karma_score[$key]["Karma"] += 5;
            $isExist = true;
        }
    }
    if(!isExist)
        $karma_score[$counter+1] = array("Userid" => $_POST['id'], "NameID" => $_POST['name'], "Karma" => 1, "LastLogin" => date("Y-m-d"));     
    echo "<br> Here is your updated table.";
    printArray($karma_score);
}

谢谢您的回复!我尝试了您的函数,加5的部分可以正常工作,但新用户无法创建。有什么想法吗? - Alec L. Kleyer
我找到了错误,只需要从if语句中去掉'!'。现在它可以工作了!谢谢!! - Alec L. Kleyer

2

由于你的数组第一层只有数字索引...你可以这样增加一行:

$karma_score[0]['Karma'] += 5;

...但这显然有点不稳定。您可能希望使用UserID号作为一个独特的数组键。然后,您可以轻松地增加给定用户的声望值。就像这样:

$karma_score = array(   
    1 => array("Userid" => 1, "NameID" => 'Doe', "Karma" => 45, "LastLogin" => "2012-08-30"),
    2 => array("Userid" => 2, "NameID" => 'Smith', "Karma" => 123, "LastLogin" => "2012-09-02"),
    3 => array("Userid" => 3, "NameID" => 'Chan', "Karma" => 1, "LastLogin" => "2011-12-23"),
    4 => array("Userid" => 4, "NameID" => 'Zee', "Karma" => 15, "LastLogin" => "2012-07-01"));

如果你这样做了,那么你就可以举例来说;
$karma_score[4]['Karma'] += 5; // Would increment Zee's karma

...无需循环查找与用户ID匹配的行。但这样做会变得非常笨重。您可能会考虑在某个时候将所有这些数据放入数据库中。您也可以:

$karma_score['Zee']['Karma'] += 5;

...并真正摆脱那个不必要的循环。为你制造问题,只会给你带来更多问题...需要对代码进行一些逻辑清理,兄弟。:)


谢谢,感谢您的回复。这是我正在进行的一个小项目,让我在 PHP 中动手实践。我最终会涉及到数据库! - Alec L. Kleyer

1
你的问题出在:

foreach ($karma_score as $key => $b) {
    if ($b['NameID'] === $_POST['name'])
        $karma_score[$key]["Karma"] += 5;
    else 
        $karma_score[$counter+1] = array("Userid" => $_POST['id'], "NameID" => $_POST['name'], "Karma" => 1, "LastLogin" => date("Y-m-d"));     
}

你不需要使用foreach,试试我的代码:

<html>

<head></head>

<body>
<div align="center">
<?php

// Array begin 
$karma_score = array(   array("Userid" => 1, "NameID" => 'Doe', "Karma" => 45, "LastLogin" => "2012-08-30"),
                        array("Userid" => 2, "NameID" => 'Smith', "Karma" => 123, "LastLogin" => "2012-09-02"),
                        array("Userid" => 3, "NameID" => 'Chan', "Karma" => 1, "LastLogin" => "2011-12-23"),
                        array("Userid" => 4, "NameID" => 'Zee', "Karma" => 15, "LastLogin" => "2012-07-01"));

// Counter for amount of users
$counter = count($karma_score);

// Function to print general array
function printArray($a){
    echo '<table border="1px">';
    echo '<tr>';
        foreach(array_keys($a[0]) as $head){
            echo '<th>'.$head.'</th>';
        }
    echo '</tr>';

    foreach($a as $b) {
    echo '<tr>';
        echo '<td>'.$b['Userid'].'</td>';
        echo '<td>'.$b['NameID'].'</td>';
        echo '<td>'.$b['Karma'].'</td>';
        echo '<td>'.$b['LastLogin'].'</td>';
    echo '</tr>';
    }
    echo '</table>';
}

echo '<br>';

function findInfo()
{
    global $karma_score;
    $counter = count($karma_score);

    //if php>5.5.0 use $names = array_column($karma_score, 'NameID');
    $names = array_map(function($element){return $element['NameID'];}, $karma_score);
    if(in_array($_POST['name'], $names)) {
       $key = array_search($_POST['name'], $names);
       $karma_score[$key]['Karma'] += 5;
    } else {
      $karma_score[$counter] = array("Userid" => $_POST['id'], "NameID" => $_POST['name'], "Karma" => 1, "LastLogin" => date("Y-m-d"));             
    }       

    echo "<br> Here is your updated table.";
    printArray($karma_score);
}

if (isset($_POST['submit'])) {
    findInfo();
}

?>

<br>


Please enter name and id. If name exists, add 5. If not, add user.
<form action="" method="POST">
    Name: <input type="text" name="name" placeholder="Enter Name Here">
    ID: <input type="text" name="id" placeholder="Enter ID #">
    <input type="submit" name="submit">


</div>
</body>

</html>

谢谢您的回复!我使用了您的函数而不是我的,然后出现了这个错误:在第89行调用了未定义的函数array_column()。在我自己查看之前,也许您注意到了什么问题? - Alec L. Kleyer
你需要的 PHP 版本 >= 5.5.0。 - Adrian Cid Almaguer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接