php foreach循环,如果condition给出额外的null值

时间:2014-07-06 11:45:20

标签: php foreach

我有一个来自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']);

3 个答案:

答案 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'];
}