PHP:为什么在关联数组中缺少值?

时间:2012-09-07 22:20:20

标签: php

当我尝试将preg_match的结果推送到另一个数组时,有人可以让我摆脱苦难并解释为什么我错过了中间值吗?在我的理解中,它要么是愚蠢的,要么是巨大的差距。无论哪种方式,我需要帮助。这是我的代码:

<?php 

$text = 'The group, which gathered at the Somerfield depot in Bridgwater, Somerset, 
        on Thursday night, complain that consumers believe foreign meat which has been 
        processed in the UK is British because of inadequate labelling.';

$word = 'the';

preg_match_all("/\b" . $word . "\b/i", $text, $matches, PREG_OFFSET_CAPTURE);

$word_pos = array();


for($i = 0; $i < sizeof($matches[0]); $i++){

    $word_pos[$matches[0][$i][0]] = $matches[0][$i][1];

}



    echo "<pre>";
    print_r($matches);
    echo "</pre>";

    echo "<pre>";
    print_r($word_pos);
    echo "</pre>";

&GT;

我得到了这个输出:

Array
(
[0] => Array
    (
        [0] => Array
            (
                [0] => The
                [1] => 0
            )

        [1] => Array
            (
                [0] => the
                [1] => 29
            )

        [2] => Array
            (
                [0] => the
                [1] => 177
            )

    )

)
Array
(
[The] => 0
[the] => 177
)

所以问题是:为什么我错过了[the] =&gt; 29?有没有更好的办法?感谢。

3 个答案:

答案 0 :(得分:1)

PHP数组是1:1映射,即一个键指向一个值。所以你要覆盖中间值,因为它也有密钥the

最简单的解决方案是使用offset作为键,匹配的字符串作为值。但是,根据您对结果的要求,完全不同的结构可能更合适。

答案 1 :(得分:1)

首先分配$word_pos["the"] = 29,然后用$word_pos["the"] = 177覆盖它。

您不会覆盖The,因为索引区分大小写。

所以也许使用像这样的对象数组:

$object = new stdClass;
$object->word = "the"; // for example
$object->pos = 29; // example :)

并将其分配给数组

$positions = array(); // just init once
$positions[] = $object;

或者你可以分配一个关联数组而不是对象,所以它就像

$object = array(
    'word' => 'the',
    'pos' => 29
);

或者指定你的方式,但不要覆盖,只需将其添加到数组中,例如:

$word_pos[$matches[0][$i][0]][] = $matches[0][$i][1];

而不是

$word_pos[$matches[0][$i][0]] = $matches[0][$i][1];

所以你会得到类似的东西:

Array
(
[The] => Array
      (
         [0] => 0
      )
[the] => Array
      (
         [0] => 29
         [1] => 177
      )
)

希望有所帮助:)

答案 2 :(得分:1)

实际发生了什么:

when i=0,
$word_pos[The] = 0   //mathches[0][0][0]=The 
when i=1
$word_pos[the] = 29       
when i=3
$word_pos[the] = 177  //here this "the" key overrides the previous one
                      //so your middle 'the' is going to lost :(

现在基于数组的解决方案可以是这样的:

for($i = 0; $i < sizeof($matches[0]); $i++){

    if (array_key_exists ( $matches[0][$i][0] , $word_pos ) ) {

        $word_pos[$matches[0][$i][0]] [] = $matches[0][$i][1];

    }

    else $word_pos[$matches[0][$i][0]] = array ( $matches[0][$i][1] );

}

现在如果转储$ word_pos,输出应为:

Array
(
[The] => Array
    (
    [0] => 0
        )
    [the] => Array 
        (
             [0] => 29 ,
             [1] => 177
        )
    )

希望有所帮助。

参考:array_key_exist