Php 循环到数组中并仅获取特定的键值对

Php 循环到数组中并仅获取特定的键值对,php,Php,我有一个来自paypal交易的$u POST数组 Array ( [address_city] => San Jose [address_country] => United States [address_country_code] => US [address_name] => Test User [address_state] => CA [address_status] => confirmed

我有一个来自paypal交易的$u POST数组

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] => test1_biz@gmail.com
    [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] => test_biz@gmail.com
    [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] => test_biz@gmail.com
    [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
如您所见,有这样的键值对

[items_name1] => Product Name 1
[items_name2] => Product Name 2
[items_name3] => Product Name 3
这些键不是常量,我的意思是,它来自购物车,因此商品名称取决于要购买的购物车中放置了多少商品。。现在我的问题是,,
如何循环到该post数组,并仅获取项目名称加上相应的值?因为我需要它们并保存在db表中

循环数组的每个元素,并使用检查键是否以“项目名称”开头。如果是,请将其添加到
$items
数组中

$items = array();
foreach ($_POST as $key => $val)
{
  if (strpos($key, 'items_name') === 0) {
    $items[$key] = $val;
  }
}
var_dump($items);
更优雅的解决方案(数据就是您的阵列)

输出:

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
        )

)

假设$test是包含值的输出数组。您可以这样做:

$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);
这里strlen(strstrstr($testKey,'item_name')检查字符串'item_name'是否作为索引存在,preg_match_all(“/.*?(\d+)$/”,$testKey,$matches)检查带有item_name的字符串是否以数值结尾。这将消除所有其他不以数值结尾的项名称键。如果你想把它也拿走,你可以把它从状态中移除


希望这有帮助。

以上Cheery的解决方案非常棒。我只是想补充一点,在这个变量中,实际上有一个指示器,指示数组中有多少产品

[num_cart_items]

如果您必须直接处理POST数组而无需将其重新格式化为其他变量,则可能会有所帮助,因为您知道要查找多少项。

我的解决方案要好得多-它将与每个产品相关的所有内容分离,而不仅仅是项名。它甚至提供了产品的数量(当然,正如前面提到的,这个数字是以数组形式提供的)。
[num_cart_items]