动态显示列表中的多个关联数组值

时间:2015-02-03 09:00:49

标签: php arrays

这是一个很难知道要搜索什么的人,但是我已经完成了家庭作业,尽管我认为这是多么普遍,但我找不到任何东西,所以我希望我能解释一下:

我正在使用PHP fgetcsv将CSV文件处理成数组,所以我有这样的数组:

[0] => Array
    (
        [0] => Australia
        [1] =>  Vic
        [2] =>  Swin
        [3] =>  Tech
    )

[1] => Array
    (
        [0] => Australia
        [1] =>  Vic
        [2] =>  Monash
        [3] =>  Psych
    )

[2] => Array
    (
        [0] => Australia
        [1] =>  NSW
        [2] =>  Monash
        [3] =>  Building
    )

我想构建一组列表,这些列表根据数组中任何元素的任何选择动态更新。也就是说,如果你选择价值" Vic",它应该用" Vic"取出所有元素。在项目[1]中 - 在这种情况下将返回数组0和1,因此显示如下列表:

Country | State | Uni | Course
-------------------------------
Aus      Vic     Swin   Tech
Aus      Vic     Monash Psych

然后你应该能够选择" Uni = Swin"得到:

Country | State | Uni | Course
-------------------------------
Aus      Vic     Swin   Tech

说实话,我甚至不确定从哪里开始正确地设计这个效率 - 即,我是否需要更改数组以创建可以轻松拉出的关联键?如果是这样,我是否需要为每个键创建一个新数组,因为我希望能够根据Country,State,Uni,Course字段过滤它们?

希望没关系,它有点广泛,但我确信它已经完成了,我只是在努力寻找一种很好的方法来构建它 - 我确定我如果我只想从一个过滤器开始,例如Country,我可以轻松地做到这一点,但我想尽可能灵活。

4 个答案:

答案 0 :(得分:0)

我确信有一种更奇特的方式,但这是可读的,并完成工作。

$array = [

    [ 'apple', 'orange', 'banana'],
    [ 'apple', 'strawberry', 'banana']

];

function getRowsThroughElementValue($value, array $array) {
    $matched = [];

    foreach($array as $row) {
        if (!is_array($row)) {
            continue; // Not an array
        }

        if (in_array($value, $row)) {
            $matched[] = $row;
        }
    }

    return $matched;
}

var_dump(getRowsThroughElementValue('apple', $array));

本质上,代码循环遍历第一个数组,然后检查整个row数组中的指定值。如果存在,请将其添加到matched数组。

答案 1 :(得分:0)

您只需将“Vic”替换为搜索字符串

即可
<?php
$haystack = Array(Array('Australia','Vic','Swin','Tech'),Array('Australia','Vic','Monash','Psych'),Array('Australia','NSW','Monash','Building'));
function recursive_array_search($needle,$haystack) {
    foreach($haystack as $key=>$value) {
        $current_key=$key;
        if($needle===$value OR (is_array($value) && recursive_array_search($needle,$value) !== false)) {
            return $current_key;
        }
    }
    return false;
}


for($i<0;$i<count($haystack);$i++)
{
    $final_array[] = $haystack[recursive_array_search('Vic',$haystack)];    
}

echo "<pre>";print_r($final_array); 
?>

答案 2 :(得分:0)

class data{

    const COUNTRY = 0;
    const STATE = 1;
    const UNI = 2;
    const COURSE = 3;

    private $csv;

    function __construct($file){

        $this->csv = fgetcsv($file);

        //$this->csv[] = array('Australia', 'Vic', 'Swin', 'Tech');
        //$this->csv[] = array('Australia', 'Vic', 'Monash', 'Psych');
        //$this->csv[] = array('Australia', 'NSW', 'Monash', 'Building');

    } 

    public function getData($type, $match) {

        $return = array();

        if (is_array($this->csv)){

            foreach ($this->csv as $key => $row){

                if (isset($row[$type])){

                    if ($row[$type] == $match){

                        $return[] = $row;

                    }

                }

            }

        }   

        return $return;

    }   

}

$data = new data('path to your file');

$rows = $data->getData($data::STATE, 'Vic');

print_r($rows);

$rows = $data->getData($data::UNI, 'Swin');

print_r($rows);

答案 3 :(得分:0)

要将所有查找保留在数组中进行大量查找,一种方法是构建索引数组。这些只是在某个查找字段上键入的简单数组,其值是主数组中与该查找匹配的所有元素的列表。您可能需要为每个字段创建一个索引数组,以便对其进行查找。

所以,你可以像这样构建uni索引:

$uni_index = array();
foreach($main_data as $key => $value) {
    $uni = $value[2];
    if(!isset($uni_index[$uni])) {
        $uni_index[$uni] = array();
    }
    $uni_index[$uni][] = $key;
}

这会给你一个这样的数组:

Array ( 
    [Swin] => Array ( [0] => 0 ) 
    [Monash] => Array ( [0] => 1 [1] => 2 ) 
)

因此,如果您执行了查找$ uni_index ['Swin'],您将得到一个数组,告诉您在索引0处有一个匹配结果。所以$ main_data [0]具有所有匹配的数据。

这使您可以更快地进行查找。因为在设置索引后你不需要循环。你总是使用数组键。如果你想把所有东西保存在数组中,并且会进行大量的查找,这可能是一个很好的方法。

根据您的使用情况,其他解决方案可能有意义。如果你偶尔会进行导入并长期保存数据,那么把它放在数据库中可能就好了。如果你只用很少的查找进行一次运行,那么简单地循环遍历数组可能是最好的方法。但是如果你想对内存中的数据进行大量的查找,那么构建这样的索引会使事情变得更有效率。