【问题标题】:PHP array only showing last item in for loopPHP数组仅显示for循环中的最后一项
【发布时间】:2020-06-25 15:21:21
【问题描述】:

我在做什么:

  • 读取 XML 配方文件并获得其风味(为简单起见,我包含了一个 sn-p)
  • 转换部分数据
  • 使用键创建多个风味数组(尝试)
  • json_encode(ing) 数组并插入到 MySQL DB 中(代码不包括在内,因为不重要)

问题和疑问

我只看到每个数组中每个 XML 配方的最后一项。你能看出我在这里做错了吗?

输出:

Array
(
    [flavourcompany] => Flavor West
    [flavourname] => Yellow Cake
    [flavourpercent] => 1.00
)
Array
(
    [flavourcompany] => Flavour Art
    [flavourname] => Honey (Miele)
    [flavourpercent] => 0.75
)

代码

$xmldata = '<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="#" ?>
<recipes>
<recipe><name><![CDATA[Bronuts]]></name><pg_vg_goal>30/70</pg_vg_goal><created_at>2016-09-29 07:48:40</created_at><url>http://tjek.nu/r/7eHn</url><flavors><flavor><name>Chocolate Glazed Doughnut (Cap)</name><percentage>7.00</percentage></flavor><flavor><name>Biscuit (Inawera)</name><percentage>0.75</percentage></flavor><flavor><name>Joy (FA)</name><percentage>0.75</percentage></flavor><flavor><name>Bavarian Cream (DX) (TPA)</name><percentage>2.00</percentage></flavor><flavor><name>Yellow Cake (FW)</name><percentage>1.00</percentage></flavor></flavors></recipe>
<recipe><name><![CDATA[Honeybee]]></name><pg_vg_goal>30/70</pg_vg_goal><created_at>2016-09-29 08:53:05</created_at><url>http://tjek.nu/r/7eJD</url><flavors><flavor><name>Cookie (Biscotto) (FA)</name><percentage>1.00</percentage></flavor><flavor><name>Marshmallow (FA)</name><percentage>2.00</percentage></flavor><flavor><name>Caramel (Caramello) (FA)</name><percentage>1.00</percentage></flavor><flavor><name>Cream Fresh (Panna Fresca) (FA)</name><percentage>2.00</percentage></flavor><flavor><name>Honey (Miele) (FA)</name><percentage>0.75</percentage></flavor></flavors></recipe></recipes>';

    $bom = simplexml_load_string($xmldata, 'SimpleXMLElement', LIBXML_NOCDATA | LIBXML_NOBLANKS);

    
    $json_string = json_encode($bom);
    $result_array = json_decode($json_string, TRUE);
    $numrecipes = count($result_array['recipe']);
            
    $flavourarray = array();
    
    
for($i = 0; $i < $numrecipes; $i++) {
    
    $recipeName = $result_array['recipe'][$i]['name'];
    $numflavours = count($result_array['recipe'][$i]['flavors']['flavor']);

    for($l = 0; $l < $numflavours; $l++) {
        
        
        $flavourName = $result_array['recipe'][$i]['flavors']['flavor'][$l]['name'];
        $flavourPercentage = $result_array['recipe'][$i]['flavors']['flavor'][$l]['percentage'];
        preg_match('/\(([A-Za-z\/]+)\)$/', $flavourName, $flavourCompanyabv);
        
        /**
            Replace company abbreviations with full company names
        */
        
        if(trim(strtolower($flavourCompanyabv[1])) == 'cap') {
            $flavourCompanyabv2 = 'Capella';
        }
        elseif(trim(strtolower($flavourCompanyabv[1])) == 'tpa') {
            $flavourCompanyabv2 = 'The Perfumers Apprentice';
        }
        elseif(trim(strtolower($flavourCompanyabv[1])) == 'fa') {
            $flavourCompanyabv2 = 'Flavour Art';
        }
        elseif(trim(strtolower($flavourCompanyabv[1])) == 'inawera' || trim(strtolower($flavourCompanyabv[1])) == 'inw') {
            $flavourCompanyabv2 = 'Inawera';
        }
        elseif(trim(strtolower($flavourCompanyabv[1])) == 'fw') {
            $flavourCompanyabv2 = 'Flavor West';
        }
        elseif(trim(strtolower($flavourCompanyabv[1])) == 'nn') {
            $flavourCompanyabv2 = 'Nude Nicotine';
        } else {
            $flavourCompanyabv2 = $flavourCompanyabv[1];
        }

        $flavourName2 = trim(preg_replace("/\(([A-Za-z\/]+)\)$/","",$flavourName));
        $flavourarray['flavourcompany'] = $flavourCompanyabv2;
        $flavourarray['flavourname'] = $flavourName2;
        $flavourarray['flavourpercent'] = $flavourPercentage;
        
    }
        echo '<pre>';
        print_r($flavourarray);
        echo '</pre>';
        
}

预期输出:

Array
(
    [flavourCompany] => Capella
    [flavourName] => Chocolate Glazed Doughnut
    [flavourPercent] => 7.00
    [flavourCompany] => Inawera
    [flavourName] => Biscuit
    [flavourPercent] => 0.75
    [flavourCompany] => Flavour Art
    [flavourName] => Joy
    [flavourPercent] => 0.75
    [flavourCompany] => The Perfumers Apprentice
    [flavourName] => Bavarian Cream (DX)
    [flavourPercent] => 2.00
    [flavourCompany] => Flavor West
    [flavourName] => Yellow Cake
    [flavourPercent] => 1.00
)
Array
(
    [flavourCompany] => Capella
    [flavourName] => Chocolate Glazed Doughnut
    [flavourPercent] => 7.00
    [flavourCompany] => Inawera
    [flavourName] => Biscuit
    [flavourPercent] => 0.75
    [flavourCompany] => Flavour Art
    [flavourName] => Joy
    [flavourPercent] => 0.75
    [flavourCompany] => The Perfumers Apprentice
    [flavourName] => Bavarian Cream (DX)
    [flavourPercent] => 2.00
    [flavourCompany] => Flavor West
    [flavourName] => Yellow Cake
    [flavourPercent] => 1.00
    [flavourCompany] => Flavour Art
    [flavourName] => Cookie (Biscotto)
    [flavourPercent] => 1.00
    [flavourCompany] => Flavour Art
    [flavourName] => Marshmallow
    [flavourPercent] => 2.00
    [flavourCompany] => Flavour Art
    [flavourName] => Caramel (Caramello)
    [flavourPercent] => 1.00
    [flavourCompany] => Flavour Art
    [flavourName] => Cream Fresh (Panna Fresca)
    [flavourPercent] => 2.00
    [flavourCompany] => Flavour Art
    [flavourName] => Honey (Miele)
    [flavourPercent] => 0.75
)

【问题讨论】:

  • 您的预期输出对于相同的键(即 flavorCompany)有多个值,这些应该是单独的子数组吗?
  • 理想情况下我希望输出如图所示
  • 不可能输出如图所示 - 数组中的每个键都必须是唯一的,否则将被覆盖。为了规避这个问题,你可以使用子数组。
  • 见下面的答案...
  • 我建议不要使用 XML->JSON->array 方法,但这可能超出了这个问题的范围。

标签: php json xml


【解决方案1】:

在循环结束时,您只需将值分配给结束数组的相同元素...

    $flavourarray['flavourcompany'] = $flavourCompanyabv2;
    $flavourarray['flavourname'] = $flavourName2;
    $flavourarray['flavourpercent'] = $flavourPercentage;

这些会覆盖以前的值,并且您不能有多个具有相同键名的项目。

改为使用...

    $flavourarray[] = ['flavourcompany' => $flavourCompanyabv2,
              'flavourname' => $flavourName2,
              'flavourpercent' => $flavourPercentage ];

将所有项目添加到一个新元素中。

根据您的测试数据,这给出(缩写)...

   [0] => Array
        (
            [flavourcompany] => Capella
            [flavourname] => Chocolate Glazed Doughnut
            [flavourpercent] => 7.00
        )

    [1] => Array
        (
            [flavourcompany] => Inawera
            [flavourname] => Biscuit
            [flavourpercent] => 0.75
        )

【讨论】:

  • 这太棒了,效果很好,显然我可以在 4 分钟内接受:/ 非常感谢您的快速回答,您为我节省了另外 4 小时的挫败感,大量 +1 :)
【解决方案2】:

PHP 数组具有唯一键,因此您必须构建一个数组数组。 所以,你必须改变:

$flavourarray[] = [
    'flavourCompany' => $flavourCompanyabv2,
    'flavourName' => $flavourName2,
    'flavourPercent' => $flavourPercentage
];

输出:

    array(2) { 
        [0]=> array(3) { 
            ["flavourCompany"]=> string(7) "Capella" 
            ["flavourName"]=> string(25) "Chocolate Glazed Doughnut" 
            ["flavourPercent"]=> float(7) 
        } 
        [1]=> array(3) {
                ["flavourCompany"]=> string(7) "Inawera" 
                ["flavourName"]=> string(7) "Biscuit" 
                ["flavourPercent"]=> float(0.75) 
        } 
    }

【讨论】:

    猜你喜欢
    • 2017-03-31
    • 1970-01-01
    • 2023-03-19
    • 2021-08-31
    • 2018-01-06
    • 2021-03-03
    • 1970-01-01
    • 2017-02-12
    • 2017-09-08
    相关资源
    最近更新 更多