Две и три версии аргументов reduce
, которые вы пытались использовать, не принимают один и тот же тип для accumulator
.
Два аргумента reduce
- , определенные как :
T reduce(T identity,
BinaryOperator accumulator)
В вашем случае T является строкой, поэтому BinaryOperator
должен принимать два аргумента String и возвращать String. Но вы передаете ему int и String, что приводит к ошибке компиляции - argument mismatch; int cannot be converted to java.lang.String
. На самом деле, я думаю, что передача 0, поскольку значение идентичности здесь также неверно, поскольку ожидается String (T).
Также обратите внимание, что эта версия сокращает процесс потока Ts и возвращает T, поэтому вы не может использовать его, чтобы уменьшить поток String до int.
Три аргумента reduce
- , определенные как :
U reduce(U identity,
BiFunction accumulator,
BinaryOperator combiner)
In ваш случай U является Integer и T является String, поэтому этот метод уменьшит поток String до Integer.
Для аккумулятора BiFunction
вы можете передавать параметры двух разных типов (U и? super T ), которые в вашем случае являются целыми и строковыми. Кроме того, значение U идентичности принимает целочисленное значение в вашем случае, поэтому передача его 0 прекрасна.
Другой способ достижения желаемого:
int length = asList("str1", "str2").stream().mapToInt (s -> s.length())
.reduce(0, (accumulatedInt, len) -> accumulatedInt + len);
Здесь тип поток соответствует типу возврата reduce
, поэтому вы можете использовать две версии параметров reduce
.
Конечно, вам не нужно использовать reduce
вообще:
int length = asList("str1", "str2").stream().mapToInt (s -> s.length())
.sum();
Почему не используйте ассоциативный массив, поэтому вы можете легко его использовать
function unserializeForm($str) {
$returndata = array();
$strArray = explode("&", $str);
$i = 0;
foreach ($strArray as $item) {
$array = explode("=", $item);
$returndata[$array[0]] = $array[1];
}
return $returndata;
}
С уважением
Это ответ на user1256561. Спасибо за вашу идею .. однако я не позаботился о расшифровке url, упомянутом в шаге 3.
, так что вот php-код, который будет декодировать сериализованные данные формы, если кому-то еще это нужно. Кстати, используйте этот код по своему усмотрению.
function xyz($strfromAjaxPOST)
{
$array = "";
$returndata = "";
$strArray = explode("&", $strfromPOST);
$i = 0;
foreach ($strArray as $str)
{
$array = explode("=", $str);
$returndata[$i] = $array[0];
$i = $i + 1;
$returndata[$i] = $array[1];
$i = $i + 1;
}
print_r($returndata);
}
Ввод данных ввода url будет выглядеть так: attribute1 = value1 & amp; attribute2 = value2 & amp; attribute3 = value3 и т. Д.
Вывод вышеуказанного кода будет по-прежнему находиться в массиве, и вы можете его изменить, чтобы присвоить ему любую переменную, и она зависит от того, как вы хотите использовать эти данные дальше.
Array
(
[0] => attribute1
[1] => value1
[2] => attribute2
[3] => value2
[4] => attribute3
[5] => value3
)
parse_str($_POST['whatever'], $searcharray);
При условии, что ваш сервер получает строку, которая выглядит примерно так (что нужно, если вы используете jQuery serialize()
):
"param1=someVal¶m2=someOtherVal"
... что-то вроде этого, вероятно, все вам нужно:
$params = array();
parse_str($_GET, $params);
$params
должно быть массивом, смоделированным так, как вы ожидали. Обратите внимание, что это также работает с массивами HTML.
Для получения дополнительной информации см. Следующее: http://www.php.net/manual/en/function.parse-str.php
Надеюсь, это полезно. Удачи!
Изменено Murtaza Hussain ответ:
function unserializeForm($str) {
$strArray = explode("&", $str);
foreach($strArray as $item) {
$array = explode("=", $item);
$returndata[] = $array;
}
return $returndata;
}
// jQuery Post
var arraydata = $('.selector').serialize();
// jquery.post serialized var - TO - PHP Формат массива
parse_str($_POST[arraydata], $searcharray);
print_r($searcharray); // Only for print array
// Вы получаете то же самое из
Array (
[A] => 1
[B] => 2
[C] => 3
[D] => 4
[E] => 5
[F] => 6
[G] => 7
[H] => 8
)
Я думаю, вам нужно отделить имена форм от своих значений, один из способов сделать это - взорвать (&)
, чтобы вы получили attribute=value,attribute2=value
.
Моя точка зрения заключается в том, что вы преобразуете сериализованную строку jQuery в массивы в PHP.
Ниже приведены шаги, которые вы должны соблюдать, чтобы быть более конкретными.
jQuery
на страницу PHP
(например, ajax.php
), где вы используете $.ajax
для отправки с помощью сообщения или получения. (&)
таким образом разделяя каждый атрибут. Теперь вы получите атрибут1 = значение, attribute2 = значение, теперь вы получите переменную массива php. например $data =
array("attribute1=value","attribute2=value")
foreach
в $data
и explode
(=)
, чтобы вы могли отделить атрибут от значения, и убедитесь, что urldecode
значение, чтобы он преобразует сериализованные значения в нужное значение и вставляет атрибут и его значение в новую переменную массива, которая сохраняет атрибут и значение сериализованной строки. Позвольте мне знайте, нужны ли вам дополнительные разъяснения.
Вам просто нужно имя атрибута значения в форме. Пример:
Форма
<form id="login_form">
<input type="text" name="username" id="a"/>
<input type="password" name="password" id="b"/>
<button type="button" onclick="login()">Submit</button>
</form>
Javascript
$(document).ready(function(){});
function login(){
var obj = $('#login_form').serialize();
$.post('index.php', obj, function(res){
alert(res);
})
}
PHP - index.php
<?php
if(!empty($POST['username']) && !empty($POST['password'])){
$user = $POST['username'];
$pass = $POST['password'];
$res = "Username : ".$user." || Password : ".$pass;
return $res;
}
?>
В HTML-странице:
<script>
function insert_tag()
{
$.ajax({
url: "aaa.php",
type: "POST",
data: {
ssd: "yes",
data: $("#form_insert").serialize()
},
dataType: "JSON",
success: function (jsonStr) {
$("#result1").html(jsonStr['back_message']);
}
});
}
</script>
<form id="form_insert">
<input type="text" name="f1" value="a"/>
<input type="text" name="f2" value="b"/>
<input type="text" name="f3" value="c"/>
<input type="text" name="f4" value="d"/>
<div onclick="insert_tag();"><b>OK</b></div>
<div id="result1">...</div>
</form>
на странице PHP:
<?php
if(isset($_POST['data']))
{
parse_str($_POST['data'], $searcharray);
$data = array(
"back_message" => $searcharray['f1']
);
echo json_encode($data);
}
?>
в этом php-коде, возвратите поле f1
.
Просто сделайте это
$get = explode('&', $_POST['seri'] ); // explode with and
foreach ( $get as $key => $value) {
$need[ substr( $value, 0 , strpos( $value, '=' ) ) ] = substr( $value, strpos( $value, '=' ) + 1 ) ;
}
// access your query param name=ddd&email=aaaaa&username=wwwww&password=wwww&password=eeee
var_dump( $need['name'] );
Я не знаю, какую версию Jquery вы используете, но это работает для меня в jquery 1.3:
$.ajax({
type: 'POST',
url: your url,
data: $('#'+form_id).serialize(),
success: function(data) {
$('#debug').html(data);
}
});
Затем вы можете получить доступ к массивам массивов POST, как обычно, в php. Попробуйте с помощью print_r()
.
Я думаю, что вы обертываете сериализованное значение формы в свойстве объекта, что бесполезно, насколько я знаю.
Надеюсь, что это поможет!
$i = 0;
– Thielicious 4 October 2016 в 14:56