PHP数组仅存储最后一个值

时间:2013-04-29 14:03:42

标签: php arrays

嗯,基本上这个代码的作用是从网站的源代码中获取一些链接并将它们发送到mp3播放器。 最大的问题是get_link函数,我想将url存储到数组中。注释我有问题的部分。 很抱歉发布了所有这些代码,但功能相互连接。

function getHost($db,$id){
        if(isset($_GET['id'])){

            $sql1 = "SELECT host FROM mixtape WHERE id=?";
            $stm = $db->prepare($sql1);
            $stm->execute(array($id));
            $row1 = $stm->fetch(PDO::FETCH_ASSOC);

            if($row1['host']=='host1'){

                $sql2 = "SELECT link1 FROM faixa WHERE id_mixtape IN(SELECT id FROM mixtape WHERE id=?)";
                $stm = $db->prepare($sql2);
                $stm->execute(array($id));

                $rows_affected = $stm->rowCount();
                        $array=array();
                if (count($rows_affected) > 0) {
                    for($i=1; $i <= $rows_affected; $i++) {

                        $row2 = $stm->fetch(PDO::FETCH_ASSOC);
                        $url=$row2['link1'];

                        get_Link($db,$url,$i,$rows_affected,$array);                        
                    }
                }
            }
        }
    }

    function get_Link($db,$url,$pos,$rows_affect,$array){ 

        $find = 'url:';
        $reg_exUrl = "/(http|https|ftp|ftps)\:\/\/[a-zA-Z0-9\-\.]+\.[a-zA-Z]{2,3}(\/\S*)?/";
        $data = file_get_contents($url);
        $data = explode("\n", $data);

        for ($line = 0; $line < count($data); $line++) {
            if (strpos($data[$line], $find) !== false) {
                $link = preg_replace($reg_exUrl,"", $data[$line]);
                $v[]=$link;
            }   
        }

        if($pos!=$rows_affect-1){
            $url="mylink.com/".$link."|";
        }else{
            $url="mylink.com/".$link."&amp";
        }

        $array[$pos]=$url;  
        var_dump($array); // Here says that are 3 values in the array. True

        if($pos==$rows_affect-1){
            var_dump($array); // Here is only showing the last value in the array. Why?
            player($db,$array);
        }
    }

    function player($db,$array){
        if(isset($_GET['id'])){
            foreach($array as $i=>$item){ 
                echo $item; 
            }
        }
    }

2 个答案:

答案 0 :(得分:1)

这段代码:

$c=0;

    for ($line = 0; $line < count($data); $line++) {
        if (strpos($data[$line], $find) !== false) {
            $link = preg_replace($reg_exUrl,"", $data[$line]);
            $v[$c]=$link;
        }   
    }

应该像:

 $c=0;

    for ($line = 0; $line < count($data); $line++) {
        if (strpos($data[$line], $find) !== false) {
            $link = preg_replace($reg_exUrl,"", $data[$line]);
            $v[$c]=$link;
            $c = $c+1; //this is missing or $c++;
        }   
    }

OR:

    for ($line = 0; $line < count($data); $line++) {
        if (strpos($data[$line], $find) !== false) {
            $link = preg_replace($reg_exUrl,"", $data[$line]);
            $v[]=$link; //That way works too
        }   
    }

答案 1 :(得分:0)

Miguelfsf,你必须先了解变量范围。

你的问题是,你创建了$ array = array()($ array显示为$ row2)。 你声明了一个新的变量,但你没有使用过,$ array只是告诉你,以这种方式声明你的数组

$row2=array().

之后你需要做

$row2[] = $stm->fetch(PDO::FETCH_ASSOC);

为什么呢? 因为assoc返回一个关联数组,所以它会做 $ array =&gt; {title =&gt; “last title} = $ newData =&gt; {title =&gt;”new title“} 它将取代价值 每次使用[],它都会创建一个新元素。 然后

{
   0 => { title => "title1"}
   1 => { title => "title2"}
   2 => { title => "title3"}
   3 => { title => "title4"}
}