我有一个来自Feed的数组,其中包含以下print_r输出:
Array
(
[0] => Array
(
[name] => Cell Phone Case
[options] => Array
(
[Colors] => Array
(
[0] => Clear
[1] => Red
[2] => Blue
)
)
Array
(
[1] => Array
(
[name] => Iphone
)
Array
(
[2] => Array
(
[name] => Tablet
[options] => Array
(
[Color] => Array
(
[0] => White
[1] => Black
[2] => Red
)
)
不幸的是,Feed提供了两种颜色的颜色,对于某些产品来说是:
options['Colors']
以及其他一些
options['Color'].
我将代码插入数据库的代码如下:
$stmt = $conn->prepare("INSERT INTO product_colors(product_id, colors) VALUES(:pid, :colors)");
if (!is_array($value['options']['Colors'])) {
$value['options']['Colors'] = array($value['options']['Colors']);
}
if (!is_array($value['options']['Color'])) {
$value['options']['Color'] = array($value['options']['Color']);
}
//Colors or Color
$colorArr = array();
if(isset($value['options']['Colors'])) {
$colorArr = $value['options']['Colors'];
}
if(isset($value['options']['Color'])) {
$colorArr = array_merge($colorArr, $value['options']['Color']);
}
$PID = ($conn->lastInsertId());
foreach ($colorArr as $colors) {
$stmt->execute(array(':pid' => $PID, ':colors' => $colors));
}
除了在每个产品颜色值的产品1(在结尾处)之外还插入空值时,数据将被插入。
的print_r($ colorArr);给出以下数组输出:
Array
(
[0] => Clear
[1] => Red
[2] => Blue
[3] =>
)
产品1的3种颜色后的额外空值...
请注意,某些产品没有像阵列2中的iphone那样的颜色值。
我该如何纠正这个问题?即使选项颜色或颜色,我也需要为相应的产品ID插入数据库中的产品颜色。
请求帮助....
更新
我自己已经纠正了这个问题。如果任何后续数组的字段为空,则默认的php array_merge函数不会合并值。这个功能如下修正:
function array_merge_corrected($array_a=array(),$array_b=array()){
$array_merge= array();
if(!empty($array_a)&& !empty($array_b)){
foreach($array_a as $field=>$value){
$array_merge[$field]= $value;
}
foreach($array_b as $field=>$value){
if(!empty($value)){
$array_merge[$field]= $value;
} elseif(!array_key_exists($field,$array_a)){
$array_merge[$field]= $value;
}
}
}
return $array_merge;
}
$colorArr = array_merge_corrected($colorArr, $value['options']['Color']);
答案 0 :(得分:1)
我认为罪魁祸首就是这段代码:
if (!is_array($value['options']['Colors'])) {
$value['options']['Colors'] = array($value['options']['Colors']);
}
if (!is_array($value['options']['Color'])) {
$value['options']['Color'] = array($value['options']['Color']);
}
如果数组不是数组,则创建一个数组,包括实际上什么都没有的情况。所以你得到一个包含空值的数组。
答案 1 :(得分:0)
似乎问题出现在array_merge
,但我想如果你在数据库中添加颜色之前检查它会更容易排序。因此,只需替换foreach
迭代以插入:
foreach ($colorArr as $colors) {
if(trim(chop($colors))!='') $stmt->execute(array(':pid' => $PID, ':colors' => $colors));
}
总而言之,我会更改您的代码:
$option=$value['options'];
// Check if values are set.
if(!isset($option['Colors'])) $option['Colors']=array();
if(!isset($option['Color'])) $option['Color']=array();
// Convert to array if dont
if(!is_array($option['Colors'])) $option['Colors']=array($option['Colors']);
if(!is_array($option['Color'])) $option['Color']=array($option['Color']);
// Finally merge
$colorArr = array_merge($option['Colors'], $option['Color']);
依旧......
希望它有所帮助!
答案 2 :(得分:0)
尝试更改行
if(isset($value['options']['Colors'])) {
$colorArr = $value['options']['Colors'];
}
要强>
if(isset($value['options']['Colors']) and $value['options']['Colors'] != null and $value['options']['Colors'] !='') {
$colorArr = $value['options']['Colors'];
}