循环到数组并获得唯一特定键值对
问题描述:
我有这样的$ _POST阵列从PayPal交易循环到数组并获得唯一特定键值对
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
来,你可以看到,有这样的键值对,
[items_name1] => Product Name 1
[items_name2] => Product Name 2
[items_name3] => Product Name 3
这些密钥不是恒定的,我的意思是,它从一个购物车来了,所以项目名称取决于有多少物品被放置在购物车,购买。现在我的问题是,如何 循环到该职位数组,并只获得item_names加上它们相应的值?,因为我需要他们,并在数据库表
答
循环保存在阵列中的每个元素,并检查是否与键启动“items_name”使用strpos
docs。如果是这样,请将其添加到$items
阵列中。
$items = array();
foreach ($_POST as $key => $val)
{
if (strpos($key, 'items_name') === 0) {
$items[$key] = $val;
}
}
var_dump($items);
答
更好的解决方案($数据是您的阵列)
$output = array();
foreach($data as $field => $value)
{
if (preg_match('/(.*)(\d+)$/', $field, $match))
{
$output[$match[2]][$match[1]] = $value;
}
}
print_r($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
)
)
答
假定$测试作为输出数组,它包含的值。你可以这样做:
$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(的strstr($密押, 'ITEM_NAME'))如果字符串 'ITEM_NAME' 存在的指数和preg_match_all(检查 “?/.*(\ d +)$ /” ,$ testKey,$ matches)检查如果带有item_name的字符串以数字值结尾。这将消除所有不以数值结尾的其他item_name键。如果你想利用还那么你可以从状态删除preg_macth
希望这有助于。上述
答
爽快的解决方案是太棒了。我只是想补充一点,你实际上有多少产品是你的阵列中的指标这个变量
[num_cart_items]
可能是,如果你要处理的接线柱阵列有帮助的情况下直接格式化成其他变量,因为你知道要查找多少物品。
我的解决方案是更好 - 它分离每种产品,而不仅仅是项目名称的一切。它甚至给你的产品数量(当然,正如它提到的,这个数字是在数组中提供的)。 – Cheery 2012-01-28 18:23:36