How not to echo a value if already in the input value? - php

I have some values in a custom field:
save_post = "1200"
Or it could be, since I need a list eventually:
save_post = "1200, 1460, 1334"
Now when I load the page, I get these values and I set them in an input field, and I also add the current value id from the current page:
$allPosts = $userPosts.", ".$postid;
Where $userPostsis the single value or the value list from the custom field, and $postid is the current page id I want to add.
The result is:
<input type="text" value="1200, 23138, 23138, 23138">
I would always get duplicate values each time I hit the update submit button as the page refreshes itself:
<form id="saveId" action="" method="POST" class="" autocomplete="off">
<input type="text" name="save_post_value" value="<?php echo $userPosts.", ".$postid; ?>">
<button type="submit" class="save_post btn btn-danger">Update</button>
</form>
How can I check if a value is already in the input and if so, don't echo it?
A way would be to have them in an Array and then output in the input field the unique array, not sure if there is a shorter way.
Trying:
$allPosts = array($userPosts.", ".$postid);
$allPosts = array_unique($allPosts);
<input type="text" name="save_post_value" value="<?php foreach ($allPosts as $value) { echo $value; } ?>">
Also:
$allPosts = array($userPosts.", ".$postid);
$allPosts = array_unique($allPosts);
$allPosts = explode(", ", $allPosts);
<input type="text" name="save_post_value" value="<?php echo $allPosts; ?>"
And tried with implode() too:
$allPosts = array($userPosts.", ".$postid);
$allPosts = array_unique($allPosts);
$allPosts = implode(", ", $allPosts);
<input type="text" name="save_post_value" value="<?php echo $allPosts; ?>"

This is very basic example, but I think that this can be useful for your needs:
<?php
// Input data
$userPosts = '19000, 23138, 23138';
$postid = '23138';
// With array
$userPosts = str_replace(' ', '', $userPosts);
if (empty($userPosts)) {
$a = array();
} else {
$a = explode(',', $userPosts);
}
$a = array_unique($a, SORT_STRING);
if (in_array($postid, $a) === false) {
$a[] = $postid;
}
$userPosts = implode(', ', $a);
echo 'Result using array: '.$userPosts.'</br>';
?>
UPDATE:
It is possible to use a function. Check for empty posts is made using empty().
<?php
function getUniquePosts($xposts, $xid) {
$xposts = str_replace(' ', '', $xposts);
if (empty($xposts)) {
$a = array();
} else {
$a = explode(',', $xposts);
}
$a = array_unique($a, SORT_STRING);
if (in_array($xid, $a) === false) {
$a[] = $xid;
}
$xposts = implode(', ', $a);
$xposts = ltrim($xposts, ",");
return $xposts;
}
$userPosts = '19000, 23138, 23138';
$postId = '23138';
echo getUniquePosts($userPosts, $postId).'</br>';
?>
Then when loading form you can try with this:
...
$a = array_unique($a, SORT_STRING);
...
update_user_meta($user_id, 'save_post', getUniquePosts($a, $user_id));

Here is my code on checking duplicate values after submission:
$userPosts = '19000, 23138, 23138';
$postid = '23138';
$pattern = "/(?:^|\W)".$postid."(?:$|\W)/";
if(preg_match($pattern, $userPosts, $matches))
{
print 'There is a duplicate '.rtrim($matches[0] , ",");
}
Basically I reuse Zhorov's variables but on his approach he put it in an array, and then check if that array contains the submitted value, mine is almost the same as his approach but instead of putting it in an array; I use regex to determine is the value existed in the string.

Related

How to pass multiple urls from text fields into array

I am trying to enter multiple urls from text field as input, into array to extract some data.
Here's my code
<form method="post">
<textarea name="urls[]" cols="150" rows="15" value=""></textarea>
<input type="submit" value="Get URLs" />
</form>
if (isset($_POST['urls']) && !empty($_POST['urls'])) {
// fetch data from specified url
foreach($_POST['urls'] as $key => $value){
$data = array($value);
$r = multiRequest($data);
}
}
foreach ($r as $key => $url){
$res = preg_match_all( "/[a-z0-9]+[_a-z0-9\.-]*[a-z0-9]+#[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,4})/i",
$url, $matches);
if($res) {
foreach(array_unique($matches[0]) as $email) {
echo $email . "<br />";
}
} else {
echo "No data found.";
}
unset($value);
Now if I enter single url,www.example1.com, if fetches the data (email). But if I enter more than one url in the form, it doesn't works (No data found).
If I define url in array manually
$data = array('www.example1.com', 'www.example2.com', 'www.example3.com');
I can extract the data (email).
How to do it for multiple entries?
If you delimit your urls by a line return, we can split and process them:
<form method="post">
<textarea name="urls" cols="150" rows="15" value=""></textarea>
<input type="submit" />
Omit the square brackets on the input name if we have one textarea. (Alternatively use many text inputs with the name attribute urls[], to get your input into an array.)
<?php
$urls = $_POST['urls'] ?? '';
$urls = preg_split('#\R#', $urls);
$emails = [];
foreach ($urls as $url)
{
$pattern = '/[a-z0-9]+[_a-z0-9\.-]*[a-z0-9]+#[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,4})/i';
if (preg_match_all($pattern, $url, $matches))
{
foreach(array_unique($matches[0]) as $email) {
$emails[] = $email;
}
}
}
if(empty($emails)) {
echo 'No emails found.';
} else {
print implode('<br>', $emails);
}
The input:
http://example.com
mailto://foo#example.com
Will output:
foo#example.com
You're passing one value in $data array by this syntax $data = array($value);.
Replace $data = array($value);
with
$data = array();
$data[] = $value;
This will append each new value to the &data array.
Example
Also, you have one textarea, it means that the value(text input) of it comes into name=urls[] as a first value of array urls[]. In PHP you'll get one value.
If you want to separate inputted data you need to split it. For example, if you will write inputs comma separated, then you'll need to make explode(",",$_POST["urls"];) at least. By the way, change name="urls[]" to simply name="urls".
Use this code for retrieving inputs comma separated:
<form method="post">
<textarea name="urls" cols="150" rows="15" value=""></textarea>
<input type="submit" value="Get URLs" />
</form>
if (isset($_POST['urls']) && !empty($_POST['urls'])) {
// fetch data from specified url
$inputs = explode(",",$_POST["urls"]);
$data = array();
foreach($inputs as $key => $value){
$data[] = $value;
}
$r = multiRequest($data);
}
As I understood your multiRequest() function should process your $data array, put this line outside the foreach loop. If you won't you will process $data array each loop.
Note: inputs should be comma separated in this case(in textarea).

Convert string to array in php, output it and then output in ascending and descending order

I have so far I have managed to convert a string to an array in php and out put it with a foreach and an echo statement. But when I try to sort it I get an error like this:
Warning: asort() expects parameter 1 to be array.
In the text book I'm studying it shows an example like this:
sort($array[,$compare]).
I don't quite understand that. I don't want to use the print_r function. I just want to echo out the result So I've come here to ask for help. I appreciate any advice. Here is my code:
<form action="list.php" method="post">
<input type="text" name="names">
<br>
<input type="submit" value="Submit">
<?php
if(!isset($name)) {$name = '';}
if(!isset($names)) {$names = '';}
if(!isset($value)) {$value = '';}
if(!isset($myarray)) {$myarray = '';}
$name = filter_input(INPUT_POST, 'name');
$names = filter_input(INPUT_POST, 'names');
$myarray = filter_input(INPUT_POST, 'myarray');
if($myarray === NULL){
$myarray = array();
}
$myarray = $names;
$name = explode(' ', $myarray);
foreach($name as $value){
echo ($value)."<br>";
}
$myarray = $names;
$name = explode(' ', $myarray);
foreach($name as $value){
echo asort($value)."<br>";
}
$myarray = $names;
$name = explode(' ', $myarray);
foreach($name as $value){
echo arsort($value)."<br>";
}
?>
First off, no need to do anything with $name here:
$name = filter_input(INPUT_POST, 'name');
Also no need to do anything with $myarray here:
$myarray = filter_input(INPUT_POST, 'myarray');
Or here:
if($myarray === NULL){
$myarray = array();
}
Since you overwrite anything that could be in it here:
$myarray = $names;
And here you overwrite $name:
$name = explode(' ', $myarray);
No need to do this either, $myarray hasn't changed since receiving this value the last time:
$myarray = $names;
Sorting should be done on the array, not the values, and sort() is propably what you want here:
$name = asort($myarray);
foreach ($name as $value){
echo "$value<br>";
}
And then the reverse sort:
$myarray = $names;
$name = arsort(explode(' ', $myarray));
foreach ($name as $value){
echo "$value<br>";
}
So, for the complete code, somewhat simplified and shortened:
<form action="list.php" method="post">
<input type="text" name="names">
<br>
<input type="submit" value="Submit">
<?php
// This is the only variable you are posting
// Also doing explode here
$names = explode(' ', filter_input(INPUT_POST, 'names'));
// Store a copy of the array here so that we have the original unchanged
$myarray = $names;
// Printing out the array as is
foreach ($myarray as $value)
{
// Double quotes to parse variables
echo "$value<br>";
}
// Sort the array
sort($myarray);
// Print it out sorted
foreach ($myarray as $value)
{
echo "$value<br>";
}
// Reverse the array
arsort($myarray);
// Print out again
foreach ($myarray as $value)
{
echo "$value<br>";
}
?>
You have to sort before the loop.
I.e.
asort($name);
foreach($name as $value){
echo $value."<br>";
}
$myarray = $names;
$name = explode(' ', $myarray);
arsort($name);
foreach($name as $value){
echo $value."<br>";
}

how to recieve auto generated array as post variable

I have tried this simple code to generate an array which will send and a form data in post method. what is the way of receiving this array in desired page? Here is the code:
$serial = 0;foreach ($results as $row) {$serial = $serial + 1;
Html:
<input class="float-lt" type="radio" value=""; ?>" name="question-<?php echo "{$serial}"; ?>[]"/>
<input class="float-lt" type="radio" value=""; ?>" name="question-<?php echo "{$serial}"; ?>[]"/>
$used_serials = $_POST['serials];
foreach( $used_serials AS &$serial ){
$key = 'question-'.$serial;
$wanted_serial_pack = $_POST[$key];
}
OR better use an multidimensional Array structure like:
name="question['serials'][$serial]"
Then you can loop over $_POST['serials]
PHP
$serial = 0;
$inputs = array();
foreach ($results as $row) {
$serial = $serial + 1;
$inputs[] = "<input name=\"question['keys']['{$serial}'][]\"/>";
}
template.php:
echo implode(' ',$inputs);
Submit.php
$results = $_POST['keys];
foreach($results as $serial_array){
var_dump($serial_array);
}
Something like this may help.

Simplifying a nested If...Else statement; flexible array

So first off, here is the code:
$greens = $_REQUEST['greens'];
$squash = $_REQUEST['squash'];
$tomatoes = $_REQUEST['tomatoes'];
$single = $greens xor $squash xor $tomatoes;
if (isset($greens,$squash,$tomatoes)) {
$array = [$greens,$squash,$tomatoes];
$product = implode(', ',$array);
} else if (isset($greens,$squash)) {
$array = [$greens,$squash];
$product = implode(', ',$array);
} else if (isset($greens,$tomatoes)) {
$array = [$greens,$tomatoes];
$product = implode(', ',$array);
} else if (isset($squash,$tomatoes)) {
$array = [$squash,$tomatoes];
$product = implode(', ',$array);
} else if (isset($single)) {
$product = $single;
} else {
$product = $_REQUEST['vendor_product'];
}
This is part of a php file to submit a vendor registration form. If the vendor selects 'produce' as their type of product, a set of checkbox options appears, and need to select at least one option. Depending on the set of options, the values selected would be collectively submitted into the database in one field. Examples of how they would be viewed in the database are: 'Greens, Squash & Zucchini', 'Greens, Squash & Zucchini, Tomatoes' and 'Greens', etc. where ', ' is inserted if more than one option is selected.
The code above works, but would like to know if there is a way to simplify this, as I will most likely be adding more options for the user to select from. Also, even though there are multiple true results for each condition, can the ternary operator still be used? I am still rather new to understanding that operator.
$names = ['greens', 'squash', 'tomatoes'];
$array = [];
foreach ($names as $name) {
if (isset($_REQUEST[$name])) {
$array[] = $_REQUEST[$name];
}
}
$product = implode(', ',$array);
if (count($array) == 0) {
$product = $_REQUEST['vendor_product'];
}
The best way to simplify this code and make it more flexible at the same time is to change the form itself and use an array.
Instead of
<input type="checkbox" name="green" value="Greens" />
<input type="checkbox" name="squash" value="Squash & Zucchini" />
<input type="checkbox" name="tomatoes" value="Tomatoes" />
You will have
<input type="checkbox" name="produce[]" value="Greens" />
<input type="checkbox" name="produce[]" value="Squash & Zucchini" />
<input type="checkbox" name="produce[]" value="Tomatoes" />
And the PHP code:
if (empty($_REQUEST['produce'])) {
$product = $_REQUEST['vendor_product'];
} else {
$product = implode(', ', $_REQUEST['produce']);
}
or with the ternary operator:
$product = empty($_REQUEST['produce']) ? implode(', ', $_REQUEST['produce']) : $_REQUEST['vendor_product'];

php accessing form variables dynamically

I have some repetitive form field variables and want to put them into variable after POST.
$item_code1 = mysql_sanitize( $_POST['item_code1'] );
$units1 = mysql_sanitize( $_POST['units1'] );
$qty1 = mysql_sanitize( $_POST['qty1'] );
$size1 = mysql_sanitize( $_POST['size1'] );
$make1 = mysql_sanitize( $_POST['make1'] );
$finish1 = mysql_sanitize( $_POST['finish1'] );
$item_code2 = mysql_sanitize( $_POST['item_code2'] );
$units2 = mysql_sanitize( $_POST['units2'] );
$qty2 = mysql_sanitize( $_POST['qty2'] );
...
These set of form variables can be 1 - 10 (or more)
I am passing how many sets of these form variables through a counter
$ctr_i = mysql_sanitize( $_POST['ctr_i'] );
How do i get the variables like above programatically ?
i mean looping through $ctr_i, i want to put all the POST values to PHP variables.
Any ideas?
<?php
foeach($_POST as $key => $val){
$$key = mysql_sanitize($val);
}
?>
You can try something like the below:
$post = $_POST;
$post = array_map('mysql_sanitize', $post);
extract($post);
After this you will have set of the variables.
It would be easier if you have input arrays in your html page like
<input type="text" name="field[]" />
<input type="text" name="field[]" />
<input type="text" name="field[]" />
Then you can collect all the values on the php side by
$field = $_POST['field'];
foreach($field as $a_field)
{
echo $a_field;
}

Categories