0

我正在 CodeIgniter 2 中开发一个项目,现在我停留在最基本的概念上。

模型:

从我的表中获取一个对象数组,其中包含与名为 的字段的特定值匹配的所有行foo。可以有一个或多个匹配的行。在这个例子中,两行。

public function get_sample($foo)
{
    $query = $this->db->get_where('sample_db', array('foo' => $foo));

    return $query->result();
}

控制器:

分配结果并使输出可供查看。

public function view($foo)
{
    $data['array'] = $this->sample_model->get_sample($foo);

    $this->load->view('view', $data);
}

看法:

echo var_dump($array); // for testing

echo $array[1]->text

var_dump()$array

array(2) {
    [0]=> object(stdClass)#23 (4) {
        ["id"]=> string(1) "1"
        ["foo"]=> string(3) "bar"
        ["number"]=> string(4) "1234"
        ["text"]=> string(23) "This is content in 1234"
    }
    [1]=> object(stdClass)#24 (4) {
        ["id"]=> string(1) "2"
        ["foo"]=> string(3) "bar"
        ["number"]=> string(4) "9999"
        ["text"]=> string(23) "This is content in 9999"
    } 
} 

的渲染输出echo $array[1]->text;为:This is content in 9999

而且我了解这一切是如何工作的: 是数组对象中字段$array[1]->text的内容,索引为,我的第二个对象。text1

但是,我有一个名为的字段number,我想以特定的方式访问该对象number并获取其相应的text值。

示例:如何检索textwhere the numberis的值9999?我不能使用$array[1]->text,因为我永远无法确定对象在数组中的位置。类似的东西$array['number' => '9999']->text,但我知道这是不对的。也许我需要遍历数组寻找匹配项?

这看起来很简单,但我尝试过的一切都失败了,并导致了各种 PHP 错误。我一直在研究 PHP 手册herehere,但似乎找不到任何关于我想要做什么的信息,或者我只是误用了我正在阅读的内容。任何指导表示赞赏。

除了使用遵循 MVC 模型的最佳实践的答案之外,我还希望有一个指向文档中正确页面的链接,并指出我上面的措辞/术语中的任何错误。


编辑:

这个答案包含我用来解决我的问题的实际代码。虽然,八木的回答被接受了,因为它让我朝着正确的方向前进。

4

4 回答 4

2

如何使用这个:

foreach ($array as $row) {
        if ($row->number == '9999') {
            echo $row->text;
        }
    }

遍历数组,找到数字对象值9999,得到文本

于 2012-12-16T02:49:45.157 回答
0

你可能正在寻找这样的东西......

array_filter($array, function($o){ return $o->number == 9999; } );

http://php.net/manual/en/function.array-filter.php

编辑

$o 是回调函数中的参数。数组的每个元素都传递给回调函数。如果函数返回 false,则该元素将被过滤掉。

$arr = array(
    (object) array(
        'num' => 33,
        'text' => 'hello',
    ),
    (object) array(
        'num' => 44,
        'text' => 'world',
    ),
);
$filtered = array_filter($arr, function($o){ return $o->num == 33; });
echo $filtered[0]->text; // hello

如您所述,索引将保留,因此请使用 array_values 或 array_shift。这是一个函数的例子

function get_by_num($arr, $num){
    return array_shift(array_filter($arr, function($o) use ($num) { return $o->num == $num; }));
}
$obj = get_by_num($arr, 44);
var_dump($obj);
// object(stdClass)#2 (2) { ["num"]=> int(44) ["text"]=> string(5) "world" }

在这种情况下,如果未找到元素,$obj 将为 NULL,或者第一个匹配项。$num 被转移,所以你可以使用任何值。你甚至可以改进它:

function get_first_match($arr, $field, $val){
    return array_shift(array_filter($arr, function($o) use ($field, $val) { return $o->{$field} == $val; }));
}
$obj = get_first_match($arr, 'num', 44);

现在您可以搜索任何字段。在你的情况下

$obj = get_first_match($array, 'number', 9999);
于 2012-12-16T02:25:19.410 回答
0

您为什么不直接查询并搜索该号码(或按该号码排序?)

无论哪种方式,您需要的是一个多维数组搜索函数(迭代对象数组并返回找到的字段值组合)

像这样的东西(把它放在助手中)

function multi_array_search($array, $field, $value) 
 { 
     $results = array(); 

     if (is_array($array)) 
     { 
         if ($array->$field == $value)  //chek the filed against teh value, you can do addional check s(i.e. if field has been set)

             $results[] = $array; 

         foreach ($array as $subarray) 
             $results = array_merge($results,  multi_array_search($subarray, $key, $value));  //recurisve serach
     } 

     return $results; 
 }


    //than in view or in controller, depending where you need it

   $result  = multi_array_search($array, "number", "9999");

var_dump($result) 将返回或是否创建实例数

array() {
    [0]=> object(stdClass)#24 (4) {
        ["id"]=> string(1) "2"
        ["foo"]=> string(3) "bar"
        ["number"]=> string(4) "9999"
        ["text"]=> string(23) "This is content in 9999"
    } 

}

于 2012-12-16T02:35:05.367 回答
0

感谢八木的回答,我想出了以下非常简单的解决方案。我遍历数组并将 的值分配给text索引与 的值匹配的新数组number。然后在视图文件中,我可以text根据这个索引访问值。

控制器:

public function view($foo)
{
    $data['array'] = $this->sample_model->get_sample($foo);

    foreach ($data['array'] as $row) {
        $data['result'][$row->number] = $row->text;
    };

    $this->load->view('view', $data);
}

看法:

if (isset($result[9999])) echo $result[9999];
于 2012-12-16T21:53:23.687 回答