Regex key values from string - php

I've a string of key value pairs with a comma as a delimiter.
I need to go through the string get the key and value and push them into an array.
I'm having an issue with writing a Regex as the value is a decimal number.
An example of the string is as follows:
value,0.23,word,0.42,dog,0.28000000000000014,cat,0,car,17.369999999999997
Any idea how to write a correct regex?
Regex just gives me a headache!

You could try the below regex to get the key, value pairs.
([a-z]+),(\d+(?:\.\d+)?)
DEMO

You can use array_chunk():
$values = array_chunk(explode(',', $string), 2)
foreach ($values as $pair) {
list($key, $value) = $pair;
// do something
}

You can use the following code:
$str = 'value,0.23,word,0.42,dog,0.28000000000000014,cat,0,car,17.369999999999997';
$parts = explode(',', $str);
$result = array();
for($i=0; $i < count($parts); $i+=2) {
$result[$parts[$i]] = $parts[$i+1];
}
var_dump($result);
Output:
array(5) {
["value"]=>
string(4) "0.23"
["word"]=>
string(4) "0.42"
["dog"]=>
string(19) "0.28000000000000014"
["cat"]=>
string(1) "0"
["car"]=>
string(18) "17.369999999999997"
}

Related

PHP usort in custom order

I am trying to sort array, lets say :
['qwe',12,'*', 324, '$we'], but I want it to sort : first numbers, then special characters and letters at last.
I know that I have to use usort(), but am not sure how to write callback function to achieve what I need.
Any ideas?
If you are trying to sort the elements in the array, and not the characters within the elements themselves, you could use the following, ugly but functional, solution:
$array = ['qwe',12,'*', 324, '$we'];
$nums = $spec = $letters = array();
foreach ($array as $i) {
if (is_numeric($i)) {
array_push($nums, $i);
}
else if (ctype_alpha($i)) {
array_push($letters, $i);
}
else if (preg_match('/[\'^£$%&*()}{##~?><>,|=_+¬-]/', $i)) {
array_push($spec, $i);
}
}
sort($nums);
sort($letters);
sort($spec);
$sorted = array_merge($nums,$spec,$letters);
var_dump($sorted);
This will iterate through your initial array and add each item to a different array, basing on its type (regex used to detect symbols). Then the single arrays are alphabetically sorted, and merged in the order of your liking.
The above code will output:
array(5) {
[0]=>
int(12)
[1]=>
int(324)
[2]=>
string(3) "$we"
[3]=>
string(1) "*"
[4]=>
string(3) "qwe"
}

how to format array from string in php?

I want if the first number in the string is 2 the output will be 2 array. How to explode as each array from string.
My code
<?php
$str = "2,2;2;,1;1;,07-09-2016;07-09-2016;,08-09-2016;10-09-2016;,1;3;,100.00;450.00;";
$data = explode(',',$str);
$out = array();
for($i=1;$i < count($data)-1;$i++){
$out[]= explode(';',$data[$i]);
}
$i = $out[0][0];
foreach ($out as $key => $value) {
for($a=0;$a < $i; $a++){
echo $value[$a]. "<br/>";
}
}
?>
I get the result 221107-09-201607-09-201608-09-201610-09-201613
But I want this format
<?php
$str = "2,2;2;,1;1;,07-09-2016;07-09-2016;,08-09-2016;10-09-2016;,1;3;,100.00;450.00;";
//format will be split by semicomma ;
$arr1 = Array('2','1','07-09-2016','08-09-2016','1','100.00');
$arr2 = Array('2','1','07-09-2016','10-09-2016','3','450.00');
?>
The php function array_column will come in handy here. Here is short code example that should output what you are looking for.
<?php
//Your original input
$str = "2,2;2;,1;1;,07-09-2016;07-09-2016;,08-09-2016;10-09-2016;,1;3;,100.00;450.00";
//explode the array into its sub-arrays
$arrs = explode(",", $str);
//remove the first element that sets how many elements are in each array
$numArrs = array_shift($arrs);
//convert strings into those wanted sub-arrays
array_walk($arrs, function(&$val, $key) { $val = explode(';',$val); });
//make the answer we need
$ans = array();
for($i=0; $i<$numArrs; $i++) {
//array_column does all the work that we want, making life easy
$ans[] = array_column($arrs, $i);
}
var_dump($ans);
This process does assume the string is properly formatted for what we are looking for - it will fail horribly if that is not the case.
Use the explode() function! It's really cool.
Here's how I would solve this problem. You will end up with a 2d array with my code. You can access $arr1 with $fourthStep[0] and $arr2 with $fourthStep[1] etc...
<?php
$str = "2,2;2;,1;1;,07-09-2016;07-09-2016;,08-09-2016;10-09-2016;,1;3;,100.00;450.00;";
$fourthStep = array();
//First, let's split that string up into something a little more.. readable.
$firstStep = explode(",",$str);
//$firstStep[0] contains our count for the total array count.
foreach($firstStep as $secondStep){ //Our second step is to loop through the newly created array which splits each section of your array
if ($secondStep != $firstStep[0]){ //skip the first part, as that is only telling us of array count
$thirdStep = explode(";",$secondStep); //third step is to get each data part of each section. The count of this array should be 'firstStep[0]-1'
for($i = 0; $i<$firstStep[0]; $i++){
//Now we want to assign the values into a 2D array
$fourthStep[$i][count($fourthStep[$i])] = $thirdStep[$i];
}
}
}
var_dump($fourthStep);
?>
Result:
array(2) { [0]=> array(6) { [0]=> string(1) "2" [1]=> string(1) "1" [2]=> string(10) "07-09-2016" [3]=> string(10) "08-09-2016" [4]=> string(1) "1" [5]=> string(6) "100.00" } [1]=> array(6) { [0]=> string(1) "2" [1]=> string(1) "1" [2]=> string(10) "07-09-2016" [3]=> string(10) "10-09-2016" [4]=> string(1) "3" [5]=> string(6) "450.00" } }
Just for a further note, you don't need the '2' in the first part of your string to work out how many arrays to split it into, as they use 2 different seperators you can work it out quite easily. Save like 8 bits of space or somethin'

Get array with regex from string

I got an php array like this:
array(3) {
[0]=> string(12) "server[edit]"
[1]=> string(14) "server[create]"
[2]=> string(12) "user[delete]"
}
I want to convert this to different arrays - for example an array named server with "edit" and "create" in it - and another array "user" with "delete".
Whats the right pattern for that ?
Thanks for any help!
Rather than trying a regex against the whole array, try matching against each individual value. Take a look at this as an example
$array = array(
'server[edit]',
'server[create]',
'user[delete]',
'dsadsa'
);
$newArray = array();
foreach($array as $value)
{
preg_match("~^(\w+)\[(\w+)\]$~", $value, $matches);
if(count($matches))
{
$key = $matches[1];
if(!isset($newArray[$key]))
$newArray[$key] = array();
$newArray[$key][] = $matches[2];
}
}
var_dump($newArray);

Extract 1st value from a multidimensional array [duplicate]

This question already has answers here:
Implode a column of values from a two dimensional array [duplicate]
(3 answers)
Closed 7 months ago.
My array is like: (Below is the dump extract)
array(3) {
[0]=> array(2) {
[0]=> string(4) "0013"
[1]=> float(28.936563322435)
}
[1]=> array(2) {
[0]=> string(4) "0003"
[1]=> float(35.514521271921)
}
[2]=> array(2) {
[0]=> string(4) "0007"
[1]=> float(47.577230340278)
}
I would like to extract its 1st value like 0013 or 0007 etc into a variable say $order such that the final result is something like this
$order= "0013,0003,0007";
I tried to do something like this:
foreach($array as $x){
$order = x[0].",";
}
BUT it only extracts the first element
You can do it using array_map() and implode():
$order = implode(',', array_map(function($a) { return $a[0]; }, $array));
// string '0013,0003,0007' (length=14)
Or, if you're using PHP 5.5 or above:
$order = implode(',', array_column($array, 0));
To achieve what you desire you can use
$order = implode(',', array_column($array, 0));
for($i=0; $i<count($array); $i++){
$res[$i]=$array[$i][0];
}
$order=implode(",", $res);
This will give you a string with the first values of your nested arrays, all comma-separated.
$arr = array();
foreach($a as $k=>$v){
$arr[] = $v[0];
}
$order = implode(',', $arr);

php regex to match key value pairs

I have a string like as below.
$string = "height=175cm weight=70kgs age=25yrs"
String contents are key value pairs each pair are separated by a Tab. I want each key value pairs as separate variable and prints out each.
I have tried with below code but i am not getting proper result please help me where i went wrong.
$string = "height=175cm weight=70kgs age=25yrs";
$pattern = "(([^=]*)\s*=\s*(.*))";
if (preg_match($pattern,$string,$match)) {
echo "<pre>";
print_r($match);
} else {
echo "not matche\n";
}
Result:
Array
(
[0] => height=175cm weight=70kgs age=25yrs
[1] => height
[2] => 175cm weight=70kgs age=25yrs
)
You can use this code:
$string = "height=175cm weight=70kgs age=25yrs";
if (preg_match_all('/\s*([^=]+)=(\S+)\s*/', $string, $matches)) {
$output = array_combine ( $matches[1], $matches[2] );
print_r($output);
}
OUTPUT:
Array
(
[height] => 175cm
[weight] => 70kgs
[age] => 25yrs
)
You can use this:
$string = "height=175cm weight=70kgs age=25yrs";
$pattern = "/(\w+)=(\d+)(\w+)/i";
if(preg_match_all($pattern,$string,$match))
{
var_dump($match);
}
Result:
array(4) {
[0]=>
array(3) {
[0]=>
string(12) "height=175cm"
[1]=>
string(12) "weight=70kgs"
[2]=>
string(9) "age=25yrs"
}
[1]=>
array(3) {
[0]=>
string(6) "height"
[1]=>
string(6) "weight"
[2]=>
string(3) "age"
}
[2]=>
array(3) {
[0]=>
string(3) "175"
[1]=>
string(2) "70"
[2]=>
string(2) "25"
}
[3]=>
array(3) {
[0]=>
string(2) "cm"
[1]=>
string(3) "kgs"
[2]=>
string(3) "yrs"
}
}
I've pasted a code sample below which helps you to solve your problem. Certainly, it is not very tightly compressed and has quite a few more lines of code than the other answers (which are all good answers!).
The reason I did this was because it looks like you may benefit from an explanation that takes you one step at a time in the progression of solving your problem, so that you can understand what is happening along the way.
Here's the code you can use:
<?php
$string = "height=175cm\tweight=70kgs\tage=25yrs";
// Divide your string into an array, with each element
// in the array being a string with a key-value pair
$pairs = explode("\t", $string);
// See what the array of pair strings looks like.
// print_r($pairs);
// Create an array to get it ready to hold key-value pairs.
$results = array();
// For each string in your array, split at the equal sign
// and set values in the $results array.
foreach ($pairs as $pair) {
$exploded_pair = explode("=", $pair);
// See what each exploded pair array looks like.
// print_r($exploded_pair);
$key = $exploded_pair[0];
$value = $exploded_pair[1];
$results[$key] = $value;
}
print_r($results);
Instead of using regular expressions, this makes use of the explode function in PHP. You can read the documentation on explode found here.
You said that your input string is separated by tabs, which is why the assignment statement for $string has \t instead of spaces. If you were to use spaces instead of tabs, then make sure that you change
$pairs = explode("\t", $string);
to
$pairs = explode(" ", $string);

Categories