这是一个很难知道要搜索什么的人,但是我已经完成了家庭作业,尽管我认为这是多么普遍,但我找不到任何东西,所以我希望我能解释一下:
我正在使用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,我可以轻松地做到这一点,但我想尽可能灵活。
答案 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]具有所有匹配的数据。
这使您可以更快地进行查找。因为在设置索引后你不需要循环。你总是使用数组键。如果你想把所有东西保存在数组中,并且会进行大量的查找,这可能是一个很好的方法。
根据您的使用情况,其他解决方案可能有意义。如果你偶尔会进行导入并长期保存数据,那么把它放在数据库中可能就好了。如果你只用很少的查找进行一次运行,那么简单地循环遍历数组可能是最好的方法。但是如果你想对内存中的数据进行大量的查找,那么构建这样的索引会使事情变得更有效率。