【问题标题】:String exploded twice array foreach loop字符串爆炸了两次数组 foreach 循环
【发布时间】:2014-02-09 20:21:45
【问题描述】:

我有这个代码:

$sample = '5ml milk, 5ml water, 3pcs carrots';

echo $sample."</br>";

$first_slice = explode(',',$sample);

foreach($first_slice as $key => $value)
{
$second_slice[$key] = explode(' ',$value);
}
print_r($second_slice);

它做我想要的,我需要将 5 毫升牛奶与 5 毫升水和 3 根胡萝卜分开 从那里我需要再次从牛奶中分离出 5 毫升。

我的问题是,我如何仅选择/回显 5ml 和牛奶作为单个数据。

以上代码产生结果:

数组 ( [0] => 数组 ( [0] => 5ml [1] => 牛奶 ) [1] => 数组 ( [0] => [1] => 5ml [2] => 水 ) [2] => 阵列 ( [0] => [1] => 3pcs [2] => 胡萝卜))

我对如何选择/回显感到很困惑,因为我将它爆炸了两次,这意味着它是数组中的一个数组。如果我的理解有误,请纠正我。

附加问题:我必须炸三次。由于我的表有名称、数量、单位列。 name 为成分名称,quantity 为数量,unit 为计量单位。

分别[牛奶] [5] [毫升]

我做了同样的事情来制作另一个数组来分离测量和数量。但它消除了冗余。

foreach($second_slice as $key=>$value)
{
$arr = explode('-',$value);
$third_slice[$arr[1]] = $arr[0];
}

输出是:

数组([ml] => 5 [pcs] => 3)

绳子上有 2 个 5ml 的。我怎样才能避免它被取出来?因为它们是不同的成分。

【问题讨论】:

    标签: php arrays loops explode


    【解决方案1】:

    你只想输出5ml milk?因为如果是这样,只需执行以下操作:

    echo $first_slice[0];

    【讨论】:

      【解决方案2】:

      目前,您有一个多维数组。您可以简化这种方法并将数组展平为一维。我建议你修改你的foreach循环如下:

      foreach($first_slice as $key => $value)
      {
          $arr = explode(' ', trim($value));
          $second_slice[$arr[1]] = $arr[0];
      }
      
      print_r($second_slice);
      

      产生输出:

      Array
      (
          [milk] => 5ml
          [water] => 5ml
          [carrots] => 3pcs
      )
      

      现在,要获取任何商品的数量,您可以直接echo $second_slice['item_name']

      如果你想从金额中找到数量的名称,可以使用array_search()

      $searchFor = '3pcs';
      echo array_search($searchFor, $second_slice);
      

      输出:

      carrots
      

      如果有多个数量相同的数量,上述方法只返回第一个。如果想全部获取,可以使用array_filter()

      $result = array_filter($second_slice, function($elem) use ($searchFor){
        return ($elem == $searchFor);
      });
      
      print_r($result);
      

      输出:

      Array
      (
          [milk] => 5ml
          [water] => 5ml
      )
      

      【讨论】:

      • 我已经浏览了所有的答案。 TBH 我对处理多维数组不太有信心,因为我有一个带有多个表(ERD)的数据库,所以我真的需要特定的值才能进入特定的表。我认为您的方法是最好的,将其展平为单个数组,这样更容易解析。
      • 一个问题,希望你注意到这一点。用这行代码。 $second_slice[$arr[1]] = $arr[0];你分配给 arr[key] = arr[value]
      • @user3205047:当然。问吧!
      • @user3205047:没错。您可以在$arr = ... 语句之后执行print_r($arr); 以查看分解数组的内容。在这种情况下,字符串的第一部分是金额,第二部分是项目名称,因此需要将数组构建为$second_slice[$arr[1]] = $arr[0];。希望能回答你的问题!
      • 感谢您的澄清。现在我可以高枕无忧了:)
      【解决方案3】:

      有一个隐藏的空格问题,但您可以使用trim 使用以下代码轻松修复它:

      $sample = '5ml milk, 5ml water, 3pcs carrots';
      
      echo $sample."</br>";
      
      $first_slice = explode(',',$sample);
      
      foreach($first_slice as $key => $value)
      {
          $second_slice[$key] = explode(' ',trim($value));
      }
      
      print_r($second_slice);
      

      产生以下数组:

      Array
      (
          [0] => Array
              (
                  [0] => 5ml
                  [1] => milk
              )
          [1] => Array
              (
                  [0] => 5ml
                  [1] => water
              )
          [2] => Array
              (
                  [0] => 3pcs
                  [1] => carrots
              )
      )
      

      【讨论】:

        【解决方案4】:

        有几种方法可以实现这一目标。这是一种方法:

        $sample = '5ml milk, 5ml water, 3pcs carrots';
        
        $items = explode(",", $sample);
        
        $final = array();
        
        foreach($items as $i){
            $value = explode(" ", trim($i));
            $final[$value[1]] = $value[0];  
        }
        
        echo "<pre>";
        print_r($final);
        echo "</pre>";
        

        【讨论】:

          【解决方案5】:

          如果你想呼应“5ml牛奶”:

          echo $second_slice[0][0] . " " . $second_slice[0][1];
          

          回显“5ml水”;

          echo $second_slice[1][0] . " " . $second_slice[1][1];
          

          echo "3pcs 胡萝卜";

          echo $second_slice[2][0] . " " . $second_slice[2][1];
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2015-04-21
            • 2015-08-28
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2016-12-04
            • 2020-07-11
            相关资源
            最近更新 更多