sasori
sasori

Reputation: 5463

loop into array and get only specific key value pair

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

Answers (4)

user1174146
user1174146

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

Sabari
Sabari

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

Cheery
Cheery

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

user895378
user895378

Reputation:

Loop over each element of the array and check if the key starts with "items_name" using strposdocs. 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

Related Questions