LOOP中的连接不能按预期工作

时间:2014-02-07 23:56:34

标签: php

我有一个循环:

  $ensplit = explode("|", $elementvalues);
  $InsertAttributes = "Insert INTO NodeAttributes (Node_ID";
  foreach($ensplit as $elementname)
                 { 
                    $InsertAttributes .= ", $elementname";
                 }  

这不起作用。我明白为什么不这样做。仅添加循环中的当前属性。所以我每次只有(Node_ID,1个元素)。有人可以帮我解决问题吗?

$ ensplit的

var_dump($ ensplit)类似于:

array(1) {
  [0]=>
  string(8) "hardware"
}
array(1) {
  [0]=>
  string(6) "access"
}
array(1) {
  [0]=>
  string(3) "IPs"
}
array(1) {
  [0]=>
  string(8) "hardware"
}
array(1) {
  [0]=>
  string(6) "access"
}
array(1) {
  [0]=>
  string(3) "IPs"
}
array(1) {
  [0]=>
  string(8) "hardware"
}
array(1) {
  [0]=>
  string(6) "access"
}
array(1) {
  [0]=>
  string(3) "IPs"

print_r($ ensplit)给出:

Array
(
    [0] => hardware
)
Array
(
    [0] => access
)
Array
(
    [0] => IPs
)
Array
(
    [0] => hardware
)
Array
(
    [0] => access
)
Array
(
    [0] => IPs
)
Array
( ...

我刚刚通过终端复制了结果而没有订单。

$ elementvalues的

var_dump($ element)是这样的:

string(6) "access"
string(3) "IPs"
string(9) "defaultgw"
string(14) "interface_name"
string(12) "interface_rx"
string(12) "interface_tx"
string(15) "interface_error"
string(8) "hardware"
string(6) "access"
string(3) "IPs"
string(9) "defaultgw"
string(14) "interface_name"
string(12) "interface_rx"

而print_r($ elementvalues)是:

interface_errorhardwareaccessIPsinterface_nameinterface_rxinterface_txinterface_errorhardwareaccessIPsinterface_nameinterface_rxinterface_txinterface_errorhardwareaccessIPsinterface_nameinterface_rxinterface_txinterface_errorhardwareaccessIPsinterface_nameinterface_rxinterface_txinterface_errorhardwareaccessIPshardwareaccessIPshardwareaccessIPshardwareaccessIPshardwareaccessIPsinterface_nameinterface_rxinterface_txinterface_errorhardwareaccessIPsinterface_nameinterface_rxinterface_txinterface_errorhardwareaccessIPsinterface_nameinterface_rxinterface_txinterface_errorhardware

我的代码输出片段

Insert INTO NodeAttributes (Node_ID, defaultgw)VALUES (10.95.8.10   , 10.95.254.165)
Insert INTO NodeAttributes (Node_ID, interface_name)VALUES (10.95.8.10  , bridge-AP-WB)
Insert INTO NodeAttributes (Node_ID, interface_rx)VALUES (10.95.8.10    , 305796188)
Insert INTO NodeAttributes (Node_ID, interface_tx)VALUES (10.95.8.10    , 2724819166)

3 个答案:

答案 0 :(得分:1)

我修改了$ ensplit。

 $ensplit = array('ele1','ele2','ele3','ele4','ele5');
 $InsertAttributes = "Insert INTO NodeAttributes (Node_ID";
 foreach($ensplit as $elementname)
             { 
                $InsertAttributes .= ", $elementname";
             }  

 echo $InsertAttributes;


 // returns: Insert INTO NodeAttributes (Node_ID, ele1, ele2, ele3, ele4, ele5

我认为问题在于$ ensplit。你应该var_dump($ ensplit)告诉我们你找到了什么。


修改

你正在使用“|”爆炸$ elementvalues,但你的print_r($ elementvalues)会返回:

    interface_errorhardwareaccessIPsinterface_nameinterface_rxinterface_txinterface_errorhardwareaccessIPsinterface_nameinterface_rxinterface_txinterface_errorhardwareaccessIPsinterface_nameinterface_rxinterface_txinterface_errorhardwareaccessIPsinterface_nameinterface_rxinterface_txinterface_errorhardwareaccessIPshardwareaccessIPshardwareaccessIPshardwareaccessIPshardwareaccessIPsinterface_nameinterface_rxinterface_txinterface_errorhardwareaccessIPsinterface_nameinterface_rxinterface_txinterface_errorhardwareaccessIPsinterface_nameinterface_rxinterface_txinterface_errorhardware

哪个没有“|”s。这有什么作用?

答案 1 :(得分:0)

根据您为$elementvalues提供的内容,我倾向于认为您没有正确使用explodeexplode有两个参数:

  1. 一个充当分隔符的字符串,以便explode知道 进行分割。您已选择|作为分隔符。
  2. 要爆炸的字符串。
  3. 然后,该函数返回所有字符串元素的数组作为该拆分的结果。

    但是,在检查您的$elementvalues字符串时,我在字符串中看不到任何|。因此,explode只返回一个包含1个元素的数组 - 原始字符串本身。

    有关如何使用explode的文档可以是found here

    另外,我们从var_dump看到的另一个奇怪的事情是$ensplit是一个二维数组,当我们期望一维数组时。我怀疑你的$elementvalues字符串有点古怪。

    编辑 - 添加以回应OP的评论

    如果没有|作为字符串中的分隔符,您问(在评论中)应该怎么做。你问,“我没有在单词之间看到空格,他们看起来加入了打印声明。我知道如何将它们分开”

    但是,除非你提供一些额外的信息或规则或字典,否则explode如何知道你希望它们如何拆分?例如,假设我给了你以下字符串:

    alvinisnowhere
    

    我问你explode分成单词,但我没有给你任何分隔符。 explode会知道您是否想要

    alvin
    is
    nowhere
    

    或者

    alvin
    is
    now
    here
    

    除非您提供其他信息,否则无法知道。

    你可以做的另一件事是提供某种有效词汇的词典。然后,不是使用explode,而是一次遍历$elementvalues一个字符并继续检查是否有字典中的字符串。

    下面是可能适合您的代码(适用于我)。但是,请记住以下警告

    1. 这假设您有一个有效字词词典。
    2. 任何字词都不能成为另一个字词中的子字符串。也就是说,如果您的字典中同时包含accessaccessible,那么我们需要调整算法要更聪明。由于看起来您的有效术语词典没有这个问题,我只是为您提供了简单而脏的代码来完成这项工作。
    3. 代码演示

      ?php
      
      $elementvalues = "interface_errorhardwareaccessIPsinterface_nameinterface_rxinterface_txinterface_errorhardwareaccessIPsinterface_nameinterface
      _rxinterface_txinterface_errorhardwareaccessIPsinterface_nameinterface_rxinterface_txinterface_errorhardwareaccessIPsinterface_nameinterface_rx
      interface_txinterface_errorhardwareaccessIPshardwareaccessIPshardwareaccessIPshardwareaccessIPshardwareaccessIPsinterface_nameinterface_rxinter
      face_txinterface_errorhardwareaccessIPsinterface_nameinterface_rxinterface_txinterface_errorhardwareaccessIPsinterface_nameinterface_rxinterfac
      e_txinterface_errorhardware";
      $dictionary = array(
        "access",
        "IPs",
        "defaultgw",
        "interface_name",
        "interface_rx",
        "interface_tx",
        "interface_error",
        "hardware",
        "access",
        "IPs",
        "defaultgw",
        "interface_name",
        "interface_rx");
      
      $ensplit = array();
      $current_string = '';
      
      // Traverse $elementvalues one character at a time.
      for ($i = 0; $i < strlen($elementvalues); $i++) {
        // $current_string gets the next character appended to it.
        $current_string .= $elementvalues[$i];
        if (in_array($current_string, $dictionary)) {
          // If $current_string is in our dictionary of valid words,
          // then add it to our $ensplit array and then reset
          // $current_string back to a blank string to get ready
          // for finding the next term.
          array_push($ensplit, $current_string);
          $current_string = '';
        }
      }
      
      // Verify
      print_r($ensplit);
      

答案 2 :(得分:-2)

编辑:学到新东西。这个答案不再有效。

您需要删除变量周围的"。现在您将其解析为字符串。

  $ensplit = explode("|", $elementvalues);
  $InsertAttributes = "Insert INTO NodeAttributes (Node_ID";
  foreach($ensplit as $elementname)
                 { 
                    $InsertAttributes .= ", ".$elementname;
                 }