The variable $page includes a webpage (full HTML file), but I want to filter that file on this line:
<a href="http://[website]/[folder]/
And I want that the 5 characters after parsed in a string.
But that strings is multiple times inside $page, so the numbers has to be stored in an array too.
So if a match is found with <a href="http://[website]/[folder]/23455, how do I get the '23455' into $nums[0]
And if another match is found with <a href="http://[website]/[folder]/12345, the '12345' will be put into $nums[1]
Take a look at http://net.tutsplus.com/tutorials/other/8-regular-expressions-you-should-know/ maybe this regular expression works for you:
/^(https?:\/\/)?([\da-z\.-]+)\.([a-z\.]{2,6})([\/\w \.-]*)*\/?$/
From what I understand from your question you are just trying to get the ending piece of the url and then do a comparison then store the value in an array? I believe this code should do the trick.
$nums = new array(); //declare your array
$a = new SimpleXMLElement('Your Link'); //create a new simple xml element
$a = $a['href'];
$array = explode("/",$a); //split the string into an array by using the / as the delimiter
if($array[count($array)-1] == '23455') { //get the count of the array and -1 from the count to get the last index then compare to required number
$nums[0] = '23455'; //store value in array
} else if ($array[count($array)-1] == '12345'{
$nums[1] = '12345'; //
}
Related
The following is the code
<?php
$id ="202883-202882-202884-0";
$str = implode('-',array_unique(explode('-', $id)));
echo $str;
?>
The result is
202883-202882-202884-0
for $id ="202883-202882-202882-0";, result is 202883-202882-0
I would like to replace the duplicate value with zero, so that the result should be like 202883-202882-0-0, not just remove it.
and for $id ="202883-0-0-0";, result should be 202883-0-0-0. zero should not be replaced, repeating zeros are allowed.
How can I archive that?
More info:
I want to replace every duplicate numbers. Because this is for a product comparison website. There will be only maximum 4 numbers. each will be either a 6 digit number or single digit zero. all zero means no product was selected. one 6 digit number and 3 zero means, one product selected and 3 blank.
Each 6 digit number will collect data from database, I dont want to allow users to enter same number multiple times (will happen only if the number is add with the URL manually.).
Update: I understand that my question was not clear, may be my English is poor.
Here is more explanation, this function is for a smartphone comparison website.
The URL format is sitename.com/compare.html?id=202883-202882-202889-202888.
All three numbers are different smartphones(their database product ID).
I dont want to let users to type in the same product ID like id=202883-202882-202882-202888. It will not display two 202882 results in the website, but it will cause some small issues. The URL will be same without change, but the internal PHP code should consider it as id=202883-202882-202888-0.
The duplicates should be replaced as zero and added to the end.
There will be only 4 numbers separated by "-".
The following examples might clear the cloud!
if pid=202883-202882-202889-202888 the result should be 202883-202882-202889-202888
if pid=202883-202883-202883-202888 the result should be 202888-0-0-0
if pid=202883-202882-202883-202888 the result should be 202883-202882-202888-0
if pid=202882-202882-202882-202882 the result should be 202882-0-0-0
I want to allow only either 6 digit numbers or single digit zero through the string.
if pid=rgfsdg-fgsdfr4354-202883-0 the result should be 202883-0-0-0
if pid=fasdfasd-asdfads-adsfds-dasfad the result should be 0-0-0-0
if pid=4354-45882-445202882-202882 the result should be 202882-0-0-0
It is too complicated for me create, I know there are bright minds out there who can do it much more efficiently than I can.
You can do a array_unique (preserves key), then fill the gaps with 0. Sort by key and you are done :)
+ on arrays will unify the arrays but prioritizes the one on the left.
Code
$input = "0-1-1-3-1-1-3-5-0";
$array = explode('-', $input);
$result = array_unique($array) + array_fill(0, count($array), 0);
ksort($result);
var_dump(implode('-',$result));
Code (v2 - suggested by mickmackusa) - shorter and easier to understand
Fill an array of the size of the input array. And replace by leftover values from array_unique. No ksort needed. 0s will be replaced at the preserved keys of array_unique.
$input = "0-1-1-3-1-1-3-5-0";
$array = explode('-', $input);
$result = array_replace(array_fill(0, count($array), 0), array_unique($array));
var_export($result);
Working example.
Output
string(17) "0-1-0-3-0-0-0-5-0"
Working example.
references
ksort - sort by key
array_fill - generate an array filled with 0 of a certain length
This is another way to do it.
$id = "202883-202882-202882-0-234567-2-2-45435";
From the String you explode the string into an array based on the delimiter which in this case is '-'/
$id_array = explode('-', $id);
Then we can loop through the array and for every unique entry we find, we can store it in another array. Thus we are building an array as we search through the array.
$id_array_temp = [];
// Loop through the array
foreach ($id_array as $value) {
if ( in_array($value, $id_array_temp)) {
// If the entry exists, replace it with a 0
$id_array_temp[] = 0;
} else {
// If the entry does not exist, save the value so we can inspect it on the next loop.
$id_array_temp[] = $value;
}
}
At the end of this operation we will have an array of unique values with any duplicates replaced with a 0.
To recreate the string, we can use implode...
$str = implode('-', $id_array_temp);
echo $str;
Refactoring this, using a ternary to replace the If,else...
$id_array = explode('-', $id);
$id_array_temp = [];
foreach ($id_array as $value) {
$id_array_temp[] = in_array($value, $id_array_temp) ? 0 : $value;
}
$str = implode('-', $id_array_temp);
echo $str;
Output is
202883-202882-0-0-234567-2-0-45435
This appears to be a classic XY Problem.
The essential actions only need to be:
Separate the substrings in the hyphen delimited string.
Validate that the characters in each substring are in the correct format AND are unique to the set.
Only take meaningful action on qualifying value.
You see, there is no benefit to replacing/sanitizing anything when you only really need to validate the input data. Adding zeros to your input just creates more work later.
In short, you should use a direct approach similar to this flow:
if (!empty($_GET['id'])) {
$ids = array_unique(explode('-', $_GET['id']));
foreach ($ids as $id) {
if (ctype_digit($id) && strlen($id) === 6) {
// or: if (preg_match('~^\d{6}$~', $id)) {
takeYourNecessaryAction($id);
}
}
}
I am fairly new to PHP and i appear to have reached a roadblock in my code.I have a variable which contains a sequence of numbers separated by a space. I intend on submitting each number into the database as an individual record. My question is how can i deconstruct the variable into individual integers with the intention of submitting each integer as a new record. Here is my code:
foreach ($domains as $domain)
{
$clicked_domains = array($form_entry->{"domain_$domain->id"});
if($clicked_domains){
foreach($clicked_domains as $final_selection){
if ($final_selection != 0){
echo $final_selection." "; // $final_selection now has the value of 17 20 12
}
}
}
}
I would now like to extract each integer from $final_selection (excluding the spaces) for submission to the DB
Check out explode():
Returns an array of strings, each of which is a substring of string formed by splitting it on boundaries formed by the string delimiter.
You can use explode to create an array of integers, and then just loop through each one.
$integer_array = explode(" ", $final_selection);
foreach($integer_array as $integer) {
//submit $integer
}
I have 2 data.
$dataA = 01,05,07;
$dataB = 01,07;
Now, I would like to explode the $dataA and combine back with only 2 string. like below:
$explode = explode(',',$dataA);
/*combine back get the max combination without duplicate string, example for the $dataA.
My suspect is: first array (01,05), second array(05,07), third array(07,01), I don't need (05,01) since first array have both value.
*/
After that, if the combination array value match with the $dataB (no matter which the value position is), then do something like:
$array[0] = '01,05';
$array[1] = '05,07';
$array[2] = '07,01';
//since $array[2] value = $dataB (no need to check specific position); so I would like to do as below
if(in_array(third array,$dataB)){ //use in_array or?
//do something
}
Is it any array function can done this?
I'm confused as to how PHP determines whether a variable is a string or an array. It seems to depend on the operators being used.
Here's an example:
<?php
$z1 = "abc";
$out = "";
for ($i = 0; $i < strlen($z1); $i++)
{
// $out[$i] = $z1[$i];
$out = $out.$z1[$i];
}
print $out;
?>
In the above version $out becomes a string (print $z1 shows "abc"). However, if I use the first line $out[$i] = $z1[$i];, $out becomes an array.
Can someone please clarify why this happens, and if its possible to access a string's characters with square brackets without converting the output to an array?
The definition of a string in PHP is considered a set of data writen in linear format (i.e: $var = "username=SmokeyBear05,B-day=01/01/1980";)
An array however is a set of data broken down into several parts. A sort of list format if you will. As an example I've written the data string from before, into an array format...
Array(['username']=>"SmokeyBear05", ['B-day']=>"01/01/1980")
Now strings are generally defined as such: $var="Your String";
Arrays however can be written in three different formats:
$var1 = array('data1','data2','data3');
$var2 = array('part A'=>'data1','part B'=>'data2','part C'=>'data3');
The output of var1 starts the index value at 0. The output of var2 however, sets a custom index value. Now the third way to write an array (least common format) is as such:
$var[0]="data1";
$var[1]="data2";
$var[2]="data3";
This takes more work, but allows you to set the index.
Most web developers working with PHP will set data from an external source as a string to deliver it to another PHP script, and then break it down into an array using the explode() function.
When you define variable $out = "", for loop doesn't understand this variable as string value. If you set $out[$i] value, by default, it was treated as an array.
If you want to get the output result as string value, you can define $out = "a" to make sure it's a string variable.
$count = count($itemArray);
// Create a new array slot to store the item #
$itemArray[$count] = $matches[1][$i];
$itemArray[$count][0] = 0;
This is part of a loop ($i is the index).
Everytime this part of the loop occurs, the number is successfully copies from $matches array to the $itemArray except the first digit of the entire number is replaced with a 0 every time. I'm sort of new to 2d arrays in php so I'm guessing the problems might lie within the 2d syntax.
Examples of what the values end up being (they should be the same)
$matches[1][$i] = 250924377376
$itemArray[$count] = 050924377376
You are not actually creating a 2-d array.
You have $itemArray which is an array.
When you do $itemArray[$count] = $matches[1][$i]; you are setting $itemArray[$count] to a string.
When you do $itemArray[$count][0] = 0; you are telling PHP to set the first character of $itemArray[$count] to 0 which is casts to a string.
In the old days of PHP, you could do this:
// create a string
$string = "Hello World!";
// reference the 2nd character in string
echo $string[1]; // "e"
PHP now discourages the array notation for strings in favor of curly braces like $string{1} instead, but the array notation still works.
I suspect the usage of curly braces was to disambiguate array access from string index access, but the old square brackets still work.
If you want a 2-d array, you should do this:
$itemArray[$count] = array(); // make $itemArray[$count] an array
$itemArray[$count][0] = 0; // set index 0 to (int)0
$itemArray[$count][1] = $matches[1][$i]; // set index 1 to the match