在PHP中合并编号列表

时间:2013-05-13 21:54:50

标签: php strpos

我有一组已经分配了数字的项目,我正在尝试填补我之前留在电子表格中的人的空白。我想我可以写一个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任何地方”

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

3 个答案:

答案 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];
    }
}