PHP foreach循环和if条件给出额外的空值



我有一个来自提要的数组,其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 
                    )
            )            

不幸的是提要以两个值提供颜色,对于某些产品它是:

options['Colors'] 

和其他

options['Color'].

将值插入DB的代码如下:

$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));
}  

正在插入数据,除了在开始处还插入一个空值,除了每个产品颜色值的product 1(在末尾)。

print_r ($ colorArr);给出以下数组输出:

Array
(
[0] => Clear
[1] => Red
[2] => Blue
[3] =>
)

产品1的3种颜色后的额外空值…

请注意,有些产品没有颜色值,如数组2中的iphone。

我怎么能纠正这个问题??我需要产品颜色插入到DB对应的产品id,即使选项都是 colors Color

请求帮助……

更新:

我已经自己纠正了这个问题。默认的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']);

我认为罪魁祸首是这段代码:

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

如果它不是数组,则创建一个数组,包括实际上没有数组的情况。所以你得到一个包含空值的数组

尝试更改

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

似乎问题是在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']);

等等…

希望有帮助!

最新更新