1

我有一组已分配数字的项目,并试图填补我之前的人在电子表格中留下的空白。我想我可以编写一个 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 年打印 [3] of $d。

我真的很困惑。我在“3502 'Scallops, Bay'”中的任何地方都看不到 2057

我应该尝试不同的方法吗?

4

3 回答 3

1

是因为订单。如果脚本达到让我们说索引为 1 的 5000,它将找不到索引为 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");
}
于 2013-05-13T22:05:03.990 回答
1

的第二个参数strpos()可以是整数或字符串;如果它是一个整数,它的序数值用于搜索。从手册

如果 needle 不是字符串,则将其转换为整数并用作字符的序数值。

您应该首先将索引转换为字符串:

if (strpos($d[$j], "$i") !== false) {

顺便说一句,最好检查该行是否以开头以及$i是否$d[$j]仍然是有效条目:

if (isset($d[$j]) && strpos($d[$j], "$i\t") === 0) {
于 2013-05-13T22:21:12.740 回答
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];
    }
}
于 2013-05-13T22:23:15.353 回答