更改我的数组,以便将值存储在一起



我有多个可能的用户通过AJAX从表单发布到我的PHP脚本。

在该脚本中,我有以下代码:

parse_str($_POST['users'], $useroutput);
foreach($useroutput as $key => $user){
// If both fields are filled in:
if(!empty($user['username']) OR !empty($user['password'])){
$userstring .= $user['username'].' '.$user['password'].'<br>';
}else{
echo 'Empty';
}
}

但是,上面的循环总是向我显示"空"。

虽然这是我的阵列打印时的样子:

[username] => Array
(
[0] => username
[1] => anotherusername
)
[password] => Array
(
[0] => password
[1] => anotherpassword
)
)

如何将我的数组更改为如下所示?

Array(
[0] => Array
(
[username] = myusername
[password] = mypassword
)
[1] => Array
(
[username] = anotherusername
[password] = anotherpassword
)
)

我已经尝试了不同的方法来发布数据,但直到现在还没有任何东西为我需要的数组提供它。

这是我如何将表单数据发布到我的 PHP 脚本中:

// Add/edit users script
$( "#companywrap" ).on("click", "#saveuser", function( event ) {
// Stop normal form behaviour
event.preventDefault();
var $form = $("#userform"),
postBody = $form.serialize(),
url = $form.attr( "action" );
var posting = $.post( url, {users: postBody});
// Show result in a div
posting.done(function( data ) {
$( ".resultmessageuser" ).empty().slideDown('fast').append( data );
});
});

我的表单标记符合要求:

<form id="userform" action="includes/userscript.php" method="post" enctype="multipart/form-data">
<div class="card m-b-20">
<div class="card-body">
<div class="form-group fieldGroup">
<div class="form-group row">
<label for="example-text-input" class="col-sm-4 col-form-label">Gebruikersnaam</label>
<div class="col-sm-8">
<input class="form-control" name="username[]" value="<?PHP echo $getcompany['username']; ?>" type="text" required>
</div>
</div>
<div class="form-group row">
<label for="example-text-input" class="col-sm-4 col-form-label">Wachtwoord</label>
<div class="col-sm-8">
<input class="form-control" name="password[]" placeholder="<?PHP echo $editpass; ?>" value='' type="text" required>
</div>
</div>
<div class="input-group-addon">
<a href="javascript:void(0)" class="btn btn-success addMore"><span class="glyphicon glyphicon glyphicon-plus" aria-hidden="true"></span> Extra gebruiker</a>
</div>
</div>
<!-- copy of input fields group -->
<div class="form-group fieldGroupCopy" style="display: none;">
<div class="form-group row">
<label for="example-text-input" class="col-sm-4 col-form-label">Gebruikersnaam</label>
<div class="col-sm-8">
<input class="form-control" name="username[]" value="" type="text" id="example-text-input">
</div>
</div>
<div class="form-group row">
<label for="example-text-input" class="col-sm-4 col-form-label">Wachtwoord</label>
<div class="col-sm-8">
<input class="form-control" name="password[]" placeholder="<?PHP echo $editpass; ?>" value='' type="text" id="example-text-input">
</div>
</div>
<div class="input-group-addon">
<a href="javascript:void(0)" class="btn btn-danger remove"><span class="glyphicon glyphicon glyphicon-remove" aria-hidden="true"></span> Verwijder velden</a>
</div>
</div>
</div>
</div>
</form>

我认为你应该从修改HTML的呈现方式开始。目前,您的form按以下方式呈现:

<form>
<input type="text" name="username[]">
<input type="text" name="password[]">
<input type="text" name="username[]">
<input type="text" name="password[]">
<button type="submit">Submit</button>
</form>

当它被发送到PHP时,POST请求将像这样读取:

[
"username" => [
0 => "john"
1 => "jane"
]
"password" => [
0 => "pw1"
1 => "pw2"
]
]

但是,如果您将 HTML 更改为按如下格式设置:

<form>
<input type="text" name="credentials[0][username]">
<input type="text" name="credentials[0][password]">
<input type="text" name="credentials[1][password]">
<input type="text" name="credentials[1][password]">
<button type="submit">Submit</button>
</form>

那么 PHP 将看到这样的 POST 请求:

[
"credentials" => [
0 => [
"username" => "john"
"password" => "pw1"
]
1 => [
"username" => "jane"
"password" => "pw2"
]
]
]

修复 HTML 后,您只需进行细微的调整:

  1. $.post( url, {users: postBody});更改为$.post( url, postBody);
  2. 现在你可以使用你最初想要的 PHP 迭代,如下所示:

    foreach($_POST['credentials'] as $credential){
    if(!empty($credential['username']) || !empty($credential['password'])){
    $userstring .= $credential['username'].' '.$credential['password'].'<br>';
    }else{
    echo 'Empty';
    }
    }
    

你循环错误。

当您循环foreach($useroutput as $key => $user){

您将获得以下内容:

(
[0] => username
[1] => anotherusername
)

在这一点上,你没有任何$user['username']你有$user[0][1]

如果你这样做:

foreach($useroutput['username'] as $key => $val){
$users[] = array_combine(['username','password'],array_column($useroutput, $key));
}
Var_dump($users);

您的$users数组将在该阵列中工作,并将按预期对用户进行分组。

如果两个索引相遇,那么您可以尝试:

$new_array = [];
for($i = 0; $i < count($useroutput); $i++){
$new_array[] = ['username'=>$useroutput['username'][$i], 'password'=>$useroutput['password'][$i]];
}

$new_array看起来像:

Array(
[0] => Array
(
[username] = myusername
[password] = mypassword
)
[1] => Array
(
[username] = anotherusername
[password] = anotherpassword
)
)

你们想太多了。输入错误,输出错误。您没有在 html 中命名键,这会导致枚举数组而不是关联数组。你不需要做复杂的php循环技巧来解释布局糟糕的表单标记,你只需要更正表单标记以按照你想要的方式嵌套。

这:

<input class="form-control" name="username[]" value="<?PHP echo $getcompany['username']; ?>" type="text" required>

需要这个:

<input class="form-control" name="users[]['username']" value="<?PHP echo $getcompany['username']; ?>" type="text" required>

而这个:

<input class="form-control" name="password[]" placeholder="<?PHP echo $editpass; ?>" value='' type="text" required>

需要这个:

<input class="form-control" name="users[]['password']" placeholder="<?PHP echo $editpass; ?>" value='' type="text" required>

这将在后端生成如下所示的数组:

print_r($_POST['users'];
array(
[0] => array(
'username' => 'some_username',
'password' => 'some_password'
)
);

不要聪明。保持简单。

最新更新