Reputation: 5463
I have this $_POST array coming from a paypal transaction
Array
(
[address_city] => San Jose
[address_country] => United States
[address_country_code] => US
[address_name] => Test User
[address_state] => CA
[address_status] => confirmed
[address_street] => 1 Main St
[address_zip] => 95131
[business] => [email protected]
[charset] => windows-1252
[custom] =>
[first_name] => Test
[item_name1] => Product Name 1
[item_name2] => Product Name 6
[item_name3] => Product Name 8
[item_number1] => 1
[item_number2] => 6
[item_number3] => 8
[last_name] => User
[mc_currency] => USD
[mc_fee] => 0.82
[mc_gross] => 18.00
[mc_gross_1] => 14.00
[mc_gross_2] => 2.00
[mc_gross_3] => 2.00
[mc_handling] => 0.00
[mc_handling1] => 0.00
[mc_handling2] => 0.00
[mc_handling3] => 0.00
[mc_shipping] => 11.00
[mc_shipping1] => 11.00
[mc_shipping2] => 0.00
[mc_shipping3] => 0.00
[notify_version] => 3.4
[num_cart_items] => 3
[payer_email] => [email protected]
[payer_id] => TRCLJTHLNCJ7Q
[payer_status] => verified
[payment_date] => 22:52:56 Jan 27, 2012 PST
[payment_fee] => 0.82
[payment_gross] => 18.00
[payment_status] => Completed
[payment_type] => instant
[protection_eligibility] => Eligible
[quantity1] => 1
[quantity2] => 1
[quantity3] => 1
[receiver_email] => [email protected]
[receiver_id] => 74PV23B8KSK84
[residence_country] => US
[tax] => 0.00
[tax1] => 0.00
[tax2] => 0.00
[tax3] => 0.00
[test_ipn] => 1
[transaction_subject] => Shopping CartProduct Name 1Product Name 6Product Name 8
[txn_id] => 7BS85664SB906284D
[txn_type] => cart
[verify_sign] => AJ2IuqHp8G0lIxhedAqrwRQbv8fVA4-Gum9e7DMZmEWIFrljEwFCJDfP
)
1
as you can see, there are key value pairs like this,
[items_name1] => Product Name 1
[items_name2] => Product Name 2
[items_name3] => Product Name 3
those keys aren't constant, I mean, it came from a shopping cart, so the item name depends on how many items were placed in the shopping cart to be purchased.. now my question is, How to loop to that post array, and get only the item_names plus their corresponding values ?, because I need them and save in a db table
Upvotes: 0
Views: 4438
Reputation: 36
Cheery's solution above is fantastic. I just wanted to add that you actually have an indicator of how many products are in your array in this variable
[num_cart_items]
Could be helpful if you have to deal with the POST ARRAY directly without reformatting it into other variables because you know how many items to look for.
Upvotes: 1
Reputation: 6345
Assuming $test as your output array which contains values. You can do like this:
$newValue = array();
foreach ($test as $testKey=>$testValue) {
if (strlen(strstr($testKey,'item_name')) >0 && preg_match_all("/.*?(\d+)$/", $testKey, $matches) > 0) {
$newValue[$testKey]=$testValue;
}
}
print_r($newValue);
Here strlen(strstr($testKey,'item_name')) checks if string 'item_name' exists as index and preg_match_all("/.*?(\d+)$/", $testKey, $matches) checks that if the string with item_name ends with a numeric value. This will eliminate all other item_name key that does not end with numeric value. If you want to take that also then you can remove that preg_macth from condition
Hope this helps.
Upvotes: 1
Reputation: 16214
More elegant solution ($data is your array)
$output = array();
foreach($data as $field => $value)
{
if (preg_match('/(.*)(\d+)$/', $field, $match))
{
$output[$match[2]][$match[1]] = $value;
}
}
print_r($output);
Output:
Array
(
[1] => Array
(
[item_name] => Product Name 1
[item_number] => 1
[mc_gross_] => 14.00
[mc_handling] => 0.00
[mc_shipping] => 11.00
[quantity] => 1
[tax] => 0.00
)
[2] => Array
(
[item_name] => Product Name 6
[item_number] => 6
[mc_gross_] => 2.00
[mc_handling] => 0.00
[mc_shipping] => 0.00
[quantity] => 1
[tax] => 0.00
)
[3] => Array
(
[item_name] => Product Name 8
[item_number] => 8
[mc_gross_] => 2.00
[mc_handling] => 0.00
[mc_shipping] => 0.00
[quantity] => 1
[tax] => 0.00
)
)
Upvotes: 2
Reputation:
Loop over each element of the array and check if the key starts with "items_name" using strpos
docs. If so, add it to the $items
array.
$items = array();
foreach ($_POST as $key => $val)
{
if (strpos($key, 'items_name') === 0) {
$items[$key] = $val;
}
}
var_dump($items);
Upvotes: 4