我有一组已经分配了数字的项目,我正在尝试填补我之前留在电子表格中的人的空白。我想我可以写一个PHP脚本为我做这个,但它将分配的数字放在奇怪的地方。
以下是一个例子:
我有一个数字/名称的关联数组
[0] => 3502 "Scallops, Bay" [1] => 3503 "Oysters, Chesepeake" [2] => 3504 "Clams, Cherry Stone"
订购这些脚本的脚本是:
$d = file("list.txt");
$j=0;
for ($i=2000;$i<8000;$i++) { //I want the codes to begin at the 2000 and end at 8000
if (strpos($d[$j], $i) !== false) {
echo $d[$j]."<br/>";
$j++;
} else {
echo $i."<br/>";
}
}
但这是我得到的:
2000-2056打印出来很好,因为它们与$ d的[0]不匹配,但随后在2057年打印
2056
3502 "Scallops, Bay"
3503 "Oysters, Chesepeake"
2059
2060
3504 "Clams, Chery Stone"
然后打印到2080年打印$ d的[3]。
我真的很困惑。我没有在“3502'扇贝,海湾'中看到2057任何地方”
我应该尝试不同的方法吗?
答案 0 :(得分:1)
这是因为订单。如果脚本可以说为5000,索引为1,则它将找不到索引为2的3000。
我的解决方案:
$A = array('3000 abc street', '2000 something', '5000 somthing other');
function ScanFor($Number, &$A) //& is realy important
{
foreach($A as $I => $V)
if(strpos($Number, $V) === 0) // so it starts with it
{
unset($A[$I]); //We don't want it anymore
list(, $Name) = explode(' ', $V, 1); //After Number there is always space, so we split it to 2 parts
return $Name;
}
return '';
}
for($I = 2000; $I < 10000; $I++)
{
printf("%d", $I);
if($Name = ScanFor($I, $A))
{
printf("\t%s", $Name)
}
printf("<br>\n");
}
答案 1 :(得分:1)
strpos()
的第二个参数可以是整数或字符串;如果它是一个整数,它的序数值用于搜索。来自manual:
如果needle不是字符串,则将其转换为整数并应用为字符的序数值。
您应首先将索引转换为字符串:
if (strpos($d[$j], "$i") !== false) {
顺便说一下,最好检查一行是否与$i
一起以及$d[$j]
是否仍然是有效条目:
if (isset($d[$j]) && strpos($d[$j], "$i\t") === 0) {
答案 2 :(得分:0)
尝试使用csv
等文件并使用SplMinHeap
进行排序
示例:强>
// Where to store Result
$store = new SortedValue();
// Read File
$fp = fopen("list.txt", "r");
// Read each file content
while(($data = fgetcsv($fp, 1000, " ")) !== FALSE) {
// Filter Empty space
$data = array_filter($data);
// Your Filter
if ($data[0] > 2000 && $data[0] < 8000) {
$store->insert($data);
}
}
// Print_r all result
print_r(iterator_to_array($store));
使用的课程
class SortedValue extends SplMinHeap {
function compare($a, $b) {
return $b[0] - $a[0];
}
}