【问题标题】:php foreach loop and if condition gives extra null valuephp foreach循环和if条件给出额外的空值
【发布时间】:2014-07-06 22:40:44
【问题描述】:

我有一个来自 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,即使选项同时是 ColorsColor

请求帮助....

更新:

我已经自己纠正了这个问题。如果任何后续数组的字段为空,则默认的 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']);

【问题讨论】:

    标签: php foreach


    【解决方案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']);
    }
    

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

    【讨论】:

    • @user3790186,绝对不是最有效的方法。好的解决方案是在创建数组之前测试该值是否也非空:if (!is_empty($value['options']['Colors']) && !is_array($value['options']['Colors']).
    【解决方案2】:

    换行试试

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

    【讨论】:

      【解决方案3】:

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

      等等……

      希望对你有帮助!

      【讨论】:

      • 你在执行前放了 if(trim(chop($colors))!='') 吗?
      • 我自己更正了这个问题,并在我的问题下方发布了解决方案。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-05-18
      • 1970-01-01
      • 2014-03-15
      • 1970-01-01
      • 2020-11-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多