PHP多维整数数组

3

目前,我将一个数组传递给我的一个函数,如下所示:

$inputs = array("FOOD" => "Pancake");

然后在我的函数中,我做了以下类似的事情

foreach ($inputs as $label => $data)
{
    echo ($label . $data);
}

以上仅是我刚写的一个示例,希望它是正确的。无论如何,拥有该foreach循环的函数还包含以下内容。
$this->SetFillColor(190,205,44);

现在对于每个循环,我还想设置输出的填充颜色。所以我考虑改为以下方式:

$inputs = array("FOOD" => array("Pancake", '190,205,44'));

如果我用var_dump函数打印我传递给函数的数组,我看到:

array:1 [▼
  "FOOD" => array:2 [▼
    0 => "PANCAKE"
    1 => "190,205,44"
  ]
]

所以这一切看起来都是正确的。现在在我的函数中,我执行以下操作:
foreach($inputs as $label => $data){
    foreach($data as $content => $colour) {

        $this->SetFillColor($colour);

        $this->Cell(65, 7, $label, 0, 0, 'L', 1, 0);
        $this->Cell(100, 7, $content, 0, 0, 'L', 1, 0);
    }
}

现在我有一些问题。首先,它似乎输出了两行。第一个单元格输出了FOOD,但第二个单元格输出了0(应该是PANCAKE)。第二行再次输出了FOOD,但第二个单元格输出了1。
那么,如何仅打印出第一行呢?另一个问题是$colour,因为它是一个字符串,但我认为它应该是一个整数。
任何建议都将不胜感激。
谢谢
2个回答

4

试试这个:

<?php

foreach($inputs as $label => $data){
    $this->Cell(65, 7, $label, 0, 0, 'L', 1, 0);
    // content is on index 0 
    $this->Cell(100, 7, $data[0], 0, 0, 'L', 1, 0);
    // color on index 1 
    $this->SetFillColor($data[1]);
}

或者更好的方法是创建一个\stdClass对象,如下:

<?php

$foo[0]['food'] = new \stdClass;
$foo[0]['food']->content= 'Pancake';
$foo[0]['food']->color = '190,205,44';

$foo[1]['food'] = new \stdClass;
$foo[1]['food']->content= 'Apple';
$foo[1]['food']->color = '255,0,0';


for($i=0,$cnt=count($foo);$i<$cnt;$i++) {
    foreach($foo[$i] as $label => $data) {
      $this->Cell(65, 7, $label, 0, 0, 'L', 1, 0);
      $this->Cell(100, 7, $data->content, 0, 0, 'L', 1, 0);
      $this->SetFillColor($data->color);
    }
}

编辑: 你也可以这样做:

<?php
    $foo[0]['food']->color = new \stdClass;
    $foo[0]['food']->content= 'Pancake';
    $foo[0]['food']->color->r = 190;
    $foo[0]['food']->color->g = 205;
    $foo[0]['food']->color->b = 44;

... [snip]

    $c = $data->color;
    $this->SetFillColor($c->r,$c->g,$c->b);

甚至可以更加面向对象地完成这个任务。
<?php

class color {

    private $r;
    private $g;
    private $b;

    public function get_r() {
        return (float) $this->r;
    }

    public function get_g() {
        return (float) $this->g;
    }

    public function get_b() {
        return (float) $this->b;
    }

    public function set_r($r) {
        $this->r = $r;
        return $this;
    }

    public function set_g($g) {
        $this->g = $g;
        return $this;       
    }

    public function set_b($b) {
        $this->b = $b;
        return $this;       
    }

    static public function factory() {
        return new color;
    }

    public function __construct() {
    }

}

class food {

    private $content;
    private $color;

    public function get_content() {
        return $this->content;
    }

    public function get_color() {
        return $this->color;
    }

    public function set_content($content) {
        $this->content = $content;
        return $this;
    }

    public function set_color(color $color) {
        $this->color = $color;
        return $this;
    }

    static public function factory() {
        return new food;
    }  

    public function __construct() {
    }   
}

$color = color::factory()->set_r(255)->set_g(0)->set_b(0);
$dataarray[] = food::factory()->set_content('Apple')->set_color($color);            

foreach($dataarray as $food) {
    echo $food->get_content();
    echo $food->get_color()->get_r();
    echo $food->get_color()->get_g();
    echo $food->get_color()->get_b();
}

谢谢,运行得非常完美。有没有办法将颜色字符串转换为3个浮点值? - katie hudson

3

我想你要写的是

$inputs = array("FOOD" => array("Pancake" => '190,205,44'));

这样'Pancake'就成为一个键,它的值是一个颜色字符串。 否则,您需要调整代码以使其读取如下:

foreach($inputs as $label => $data){
    $content = $data[0];
    $color = $data[1];

    $this->SetFillColor($colour);
    $this->Cell(65, 7, $label, 0, 0, 'L', 1, 0);
    $this->Cell(100, 7, $content, 0, 0, 'L', 1, 0);
}

无论哪种方法都可以解决问题。
目前,$inputs = array("FOOD" => array("Pancake", '190,205,44')); 仅将 'FOOD' 条目设置为包含键为 0,1 的数组,因此您的 $content 变量将迭代 0,1,而 $color 将迭代值 'PANCAKE','190,205,44'

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接