Forum Moderators: coopster

Message Too Old, No Replies

How to search a string? String Manipulation Question

         

pazazuzu

5:26 pm on Apr 14, 2010 (gmt 0)

10+ Year Member



Hi everyone,

I currently have an assignment which I am almost done with but am having problems trying to figure out how to integrate a string function search. I have a text box called $targetstring. My program allows users to input items such as groceries into one text box (item_value) and add an amount to the groceries purchased (amount_value).

The program will add the amounts and give a total and will validate the amount_value box for inputs that are not numerical and give an error count if anything other than a number is entered.

I have also added to radio buttons that let you sort the array of values into ascending or descending order.

Everything works fine but I am trying to add one other feature. A text input box called $targetstring that will allow a user to input any text, be it a phrase, letters or single letter and then the program will search all the values input into the item_value text boxes and will highlight them yellow if they match any of the variables entered into the $targetstring input box.

I have included my code. This last part of the assignment is driving me crazy so any help would be greatly appreciated.

Thanks,
Mike


<html>
<head>
<title>My Bills</title>
</head>

<body>

<body style="font-family: Arial, Helvetica, sans-serif; color: black;">

<h1>My Bills</h1>


<form method=post>

<br><b>Sort order for items:</b>
<br>
<br>

<?php

$sort_order = $_POST['sort_order']; //added code for asgn 6

$targetstring = $_POST['targetstring']; //added code for asgn 7


if (isset($_POST['Submit'])) //The following code is intended to retain the choice of the radio button chosen by the user


$sort_order = $_POST['sort_order'];

switch($sort_order)
{
case 'desc' :
print "Ascending <input type=radio name=sort_order value=asc>&nbsp;&nbsp;&nbsp;";
print "Descending <input type=radio name=sort_order value=desc checked>&nbsp;&nbsp;&nbsp;";
break;

default :

print "Ascending <input type=radio name=sort_order value=asc checked>&nbsp;&nbsp;&nbsp;";
print "Descending <input type=radio name=sort_order value=desc>&nbsp;&nbsp;&nbsp;";
break;

}


$sort_line = array(); //Declare an empty array - added code for asgn 6


for ($row = 1; $row <5 ; $row++) // creates rows that are less than 5
{

$item_name='item'.$row; // assign values
$item_value=$_POST[$item_name]; // assign values

$amount_name='amount'.$row; // assign values
$amount_value=$_POST[$amount_name]; // assign values


$myelement = "$item_value*$amount_value*";


array_push($sort_line, $myelement); //Adds $myelement to the end of the $sort_line array

}

if ($sort_order == 'desc')
{
rsort($sort_line); //Sorts array in place - added code for asgn 6
} else {
sort($sort_line); //Sorts array in place - added code for asgn 6
}


?>


<br />
<br />


<br><b>Find Items that Contain:</b>
<input type=text name=targetstring size=20>
<br>
<br>


<table>

<tr>
<th>Item</th><th>Amount</th>
</tr>


<?php


$err_cnt = 0;
$total_amt = 0;
$read_ctr = 1;


for ($row = 1; $row <5 ; $row++) // creates rows that are less than 5

{
$item_name='item'.$row; // assign values

$array_counter = $row - 1; //To make sure to get element 0 in the array - added code for asgn 6


$amount_name='amount'.$row; // assign values

$array_counter = $row - 1; //To make sure to get element 0 in the array - added code for asgn 6


list($item_value_from_array, $amount_value_from_array) = explode('*',$sort_line[$array_counter]);


print"<tr>\n";
print"<td><input type=text name=".$item_name." value='$item_value_from_array'></td>\n"; // prints rows with saved values - added code for asgn 6
print"<td><input type=text name=".$amount_name." value='$amount_value_from_array'></td>\n"; // prints rows with saved values - added code for asgn 6


list($item_read, $amount_read) = explode("*", $sort_line[$array_counter]); // attempting to break up the Array elements into variables using explode function



if (!empty($amount_read)) //if amount value is not empty
{
if (is_numeric($amount_read)) // checks to see if amount value is a numeric number
{
$total = $total + $amount_read; //adds the total of the amount column and created the $total variable
} else {
print"<td><font color=red>Amount: $amount_read is not a number</font></td>"; // if amount value is not numberic then prints error in red
$error_count++; // counts number of invalid amounts
}
}

print"</tr>\n";
}

?>


</table>


<?php
if ($error_count >0) // if statement checking to see if errors; if there are, then prints them. If not then prints total amount only
{
print"<br>Errors: $error_count"; // prints total of invalid amount errors
} else {
print"<br>Total: $total"; // prints total of amounts
}
?>


<br><br><input type=submit value=Submit>
<br>
<br>


</form>
</body>
</html>

Readie

5:55 pm on Apr 14, 2010 (gmt 0)

WebmasterWorld Senior Member 10+ Year Member



Welcome to Webmaster World pazazuzu.

If you have your list of items contained in a variable, (with no HTML there - if you're adding HTML to it, that needs to come last otherwise this might cause some damage) then you could do this with a regular expression.

For the following function, $input is the user's search string, $after_input is what you are searching through.

If you enter the optional third parameter as "1" it will allow you to highlight multiple search strings, however $input will need to be in the format of a single dimension array.

function highlight_search($input, $after_input, $multi = 0) {
if($multi === 1) {
foreach($input as $in) {
$ins = preg_quote($in, "/");
if(preg_match($ins, $after_input) {
while(preg_match($ins, $after_input, $out)) {
$repl = '<span style="background-color: #cccc00;">' . $out[0] . '</span>';
$after_input = str_replace($out[0], $repl, $after_input);
}
}
}
} else {
$ins = preg_quote($input, "/");
if(preg_match($ins, $after_input) {
while(preg_match($ins, $after_input, $out)) {
$repl = '<span style="background-color: #cccc00;">' . $out[0] . '</span>';
$after_input = str_replace($out[0], $repl, $after_input);
}
}
}
return $after_input;
}

I'm not 100% certain this will work, I've not tested it.

pazazuzu

7:48 pm on Apr 14, 2010 (gmt 0)

10+ Year Member



Okay, I will give it a shot. Some of the code is a little different than anything I have tried before in my code. But then again, that's probably why I don't seem to get it.

Thank you. I will give it a try to see if it works.