我有以下代码,目前将结果限制为几种类型(Banana,Orange或所有):
function selectFromArray($prefix="", $productArray=array()) {
if(!strlen($prefix)) return $productArray;
return array_filter($productArray,
create_function('$element',
'return (stripos($element[1],'.var_export($prefix, true).') === 0); '));
}
$setype = $_GET[stype];
$list = selectFromArray($setype, $list);
foreach($list as $r)
{
$size2 = $r[2];
echo "<tr>
<td id=\"id\"><span id=\"non_sorting_header\">" .$r[0]. "</span></td>
<td id=\"name\"><span id=\"non_sorting_header\">" .$r[1]. "</span></td>
<td id=\"speed\"><span id=\"sorting_header\">" .kMGTB2($size2). "</span></td>
<td id=\"download\"><span id=\"sorting_header\">" .$r[3]. " Gb<br />per month</span></td>
<td id=\"contract\"><span id=\"sorting_header\">1<br />month</span></td>
<td id=\"info\"><span id=\"non_sorting_header\">".$r[5]."</span></td>
<td id=\"buy\"><span id=\"non_sorting_header\">£".$r[4]."<br />".$r[6]."</span></td>
</tr>";
}
$ r [0]是产品类型,$ setype = $ _GET [stype]; 设置产品类型。
我需要结合上面的代码,通过使用$ r [0]进一步限制结果,这是数组中的id值。该数组是从另一个站点的XML查询创建的 - 所以我无法控制它,因此它不仅仅是从数组中删除条目的情况。
例如,数组中最多可以包含50个不同的id,但我想将表中显示的ID限制为10(1024,1045,1023等)。
请帮助这是我的头脑!!!!
答案 0 :(得分:0)
您可以添加计数器并在经过10次迭代后中断,因为您无法修改查询。
$ids = array(1043,1055,1078);
foreach($list as $r)
{
if (in_array($r[0], $ids))
{
$size2 = $r[2];
echo "<tr>
<td id=\"id\"><span id=\"non_sorting_header\">" .$r[0]. "</span></td>
<td id=\"name\"><span id=\"non_sorting_header\">" .$r[1]. "</span></td>
<td id=\"speed\"><span id=\"sorting_header\">" .kMGTB2($size2). "</span></td>
<td id=\"download\"><span id=\"sorting_header\">" .$r[3]. " Gb<br />per month</span></td>
<td id=\"contract\"><span id=\"sorting_header\">1<br />month</span></td>
<td id=\"info\"><span id=\"non_sorting_header\">".$r[5]."</span></td>
<td id=\"buy\"><span id=\"non_sorting_header\">£".$r[4]."<br />".$r[6]."</span></td>
</tr>";
}
}
修改:
我假设您想将结果限制为前10个ID。我不确定你是否想将它限制为10个特定ID。请澄清是否是这种情况
编辑2: 容纳基本数组中的特定ID。
答案 1 :(得分:0)
你能创建第二个临时数组,并循环显示第一个元素 - 从你想要显示的第一个对象开始吗?
// Pseudo code, ignore minor errors :P
$array = array();
for ($i = 1023, $i > 1034, $i++){
// Copy your array elements from $r to $temp;
}
foreach ($temp as $whatever) {
// Print out $whatever
}
这会诀窍吗?显然你会改变1023和1034以适应你的价值观。
答案 2 :(得分:0)
您可以创建另一个过滤器功能,该功能允许您根据特定键过滤数组。我是用foreach完成的,但您可以像使用其他函数一样使用array_filter()
和create_function()
。
function filterArrayByKeyInArray($array, $searchKey, $searchValues) {
$result = array();
foreach ($array as $key => $row) {
if (in_array($row[$searchKey], $searchValues)) {
$result[$key] = $row;
}
}
return $result;
}
//snip
$list = selectFromArray($setype, $list);
$list = filterArrayByKeyInArray($list, 0, array(1024,1045,1023));
您可以将两者合并为一个功能,这可能会更快,但对其他任务不太有用。
答案 3 :(得分:0)
一个非常好用且灵活的OOP方式是使用FilterIterator
类(PHP&gt; = 5.1.0):
class PrefixFilter extends FilterIterator
{
/**
* @var string
*/
protected $_prefix;
/**
* @param Iterator $iterator
* @param string $prefix
*/
public function __construct(Iterator $iterator, $prefix)
{
parent::__construct($iterator);
$this->_prefix = $prefix;
}
/**
* @return boolean
*/
public function accept()
{
if (!strlen($this->_prefix)) {
return true;
} else {
$item = $this->getInnerIterator()->current();
return (stripos($item[1], $this->_prefix) === 0);
}
}
}
class IdFilter extends FilterIterator
{
/**
* @var array
*/
protected $_ids;
/**
* @param Iterator $iterator
* @param array $ids
*/
public function __construct(Iterator $iterator, array $ids)
{
parent::__construct($iterator);
$this->_ids = $ids;
}
/**
* @return boolean
*/
public function accept()
{
$item = $this->getInnerIterator()->current();
return (in_array($item[0], $this->_ids));
}
}
这允许您执行以下操作:
$iterator = new IdFilter(
new PrefixFilter(
new ArrayIterator($list),
''
),
array(1024, 1045, 1023)
);
foreach($iterator as $r) {
$size2 = $r[2];
echo "<tr>
<td id=\"id\"><span id=\"non_sorting_header\">" .$r[0]. "</span></td>
<td id=\"name\"><span id=\"non_sorting_header\">" .$r[1]. "</span></td>
<td id=\"speed\"><span id=\"sorting_header\">" .kMGTB2($size2). "</span></td>
<td id=\"download\"><span id=\"sorting_header\">" .$r[3]. " Gb<br />per month</span></td>
<td id=\"contract\"><span id=\"sorting_header\">1<br />month</span></td>
<td id=\"info\"><span id=\"non_sorting_header\">".$r[5]."</span></td>
<td id=\"buy\"><span id=\"non_sorting_header\">£".$r[4]."<br />".$r[6]."</span></td>
</tr>";
}
这样,您的过滤器被封装到单独的类中,并且可以任意堆叠。开销很小,你在设计和可重用性方面获得了很多(你可以摆脱你的动态功能)。