0

I have simple text string, it is looking like that:

30143*1,30144*2,30145*3,30146*5,30147*5

And i have to transform this text string to array with this structure:

Array ( [0] => Array ( [product] => 30143 [qty] => 1 ) [1] => Array ( [product] => 30144 [qty] => 2 ) [2] => Array ( [product] => 30145 [qty] => 3 ) [3] => Array ( [product] => 30146 [qty] => 4 ) [4] => Array ( [product] => 30147 [qty] => 5 ) )

Is it even possible and if so how?

I found this:

$myString = "9,[email protected],8";
$myArray = explode(',', $myString);
print_r($myArray);

But this is only creating the array with no keys and wtih example there is no way to get the qty key with *.

Thanks in advance!

1
  • explode() is a good start. Now you want to look into array_map() and then use explode() inside array_map() again. Commented Aug 4, 2016 at 14:58

4 Answers 4

2

Here you go. You need to iterate through all the 30143*1 items. array_map do this job for you.

function getPieces($val) {
    $pieces  = explode('*', $val);
    return ['product' => $pieces[0], 'qty' => $pieces[1]];
}

$str = '30143*1,30144*2,30145*3,30146*5,30147*5';
$result = array_map('getPieces', explode(',', $str));

var_dump($result);

OUTPUT:

array (size=5)
  0 => 
    array (size=2)
      'product' => string '30143' (length=5)
      'qty' => string '1' (length=1)
  1 => 
    array (size=2)
      'product' => string '30144' (length=5)
      'qty' => string '2' (length=1)
  2 => 
    array (size=2)
      'product' => string '30145' (length=5)
      'qty' => string '3' (length=1)
  3 => 
    array (size=2)
      'product' => string '30146' (length=5)
      'qty' => string '5' (length=1)
  4 => 
    array (size=2)
      'product' => string '30147' (length=5)
      'qty' => string '5' (length=1)
Sign up to request clarification or add additional context in comments.

Comments

2

This could be one of the possible ways:

$string = '30143*1,30144*2,30145*3,30146*5,30147*5';

$products = explode(',',$string);
$result = array();
foreach ($products as $productAndQuantity) {
    $result[] = array_combine(array('product', 'qty'), explode('*', $productAndQuantity));
}

var_dump($result);

output:

array(5) {
  [0]=>
  array(2) {
    ["product"]=>
    string(5) "30143"
    ["qty"]=>
    string(1) "1"
  }
  [1]=>
  array(2) {
    ["product"]=>
    string(5) "30144"
    ["qty"]=>
    string(1) "2"
  }
  [2]=>
  array(2) {
    ["product"]=>
    string(5) "30145"
    ["qty"]=>
    string(1) "3"
  }
  [3]=>
  array(2) {
    ["product"]=>
    string(5) "30146"
    ["qty"]=>
    string(1) "5"
  }
  [4]=>
  array(2) {
    ["product"]=>
    string(5) "30147"
    ["qty"]=>
    string(1) "5"
  }
}

Comments

1

Hooray for regex solutions

$str = '30143*1,30144*2,30145*3,30146*5,30147*5';

if (preg_match_all('/(?<product>[^*]+)\*(?<qty>[^,]+),?/', $str, $matches, PREG_SET_ORDER)) {
    $result = array_map(
        function ($match) { return array_intersect_key($match, array_flip(['product', 'qty'])); },
        $matches
    );
    print_r($result);
}

The preg_match_all call already mostly does what you want, $matches is already sort of the expected result, it just has some additional entires which the array_intersect_key gets rid of.

2 Comments

You can also unset the 3 numeric keys.
Yes, I could. Wouldn't say that's necessarily easier though.
0

@deceze variant:

preg_match_all('~(?<product>\d+)\*(?<qty>\d+)~', $str, $result, PREG_SET_ORDER);
foreach($result as &$m) { unset($m[0], $m[1], $m[2]); }

print_r($result);

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.