2012-07-14 12:33:20  浏览:1360

替换字符

替换中用到的最核心的一个方法

/**

     * 把$base的某些元素替换成$replacements
     * 本来php库中是有这个函数的,不知道为什么就是调用不起,所以就copy过来啦,希望不要出错了。
     *
     * @param $base 需要被替换的数组           
     * @param $replacements 替换内容           
     * @return array 替换之后的数组
     * @example $base = array('citrus' => array( "orange") , 'berries' =>
     *          array("blackberry", "raspberry"), );
     *          $replacements = array('citrus' => array('pineapple'), 'berries'
     *          => array('blueberry'));
     *          $basket = array_replace_recursive($base, $replacements);
     *          print_r($basket);
     *        
     */
    function array_replace_recursive($base, $replacements) {
        foreach ( array_slice ( func_get_args (), 1 ) as $replacements ) {
            $bref_stack = array (
                    &$base
            );
            $head_stack = array (
                    $replacements
            );
           
            do {
                end ( $bref_stack );
               
                $bref = &$bref_stack [key ( $bref_stack )];
                $head = array_pop ( $head_stack );
               
                unset ( $bref_stack [key ( $bref_stack )] );
               
                foreach ( array_keys ( $head ) as $key ) {
                    if (isset ( $key, $bref ) && is_array ( $bref [$key] ) && is_array ( $head [$key] )) {
                        $bref_stack [] = &$bref [$key];
                        $head_stack [] = $head [$key];
                    } else {
                        $bref [$key] = $head [$key];
                    }
                }
            } while ( count ( $head_stack ) );
        }
       
        return $base;

    }

替换方法开始

/**
     * 相对地址改为绝对地址
     *
     *
     */
    public function replaceImg($data, $keys = array()) {
        if (! empty ( $data ) && is_array ( $data [0] )) {
            foreach ( $keys ["param"] as $k => $v ) {
                if (! is_array ( $v )) {
                    if (! empty ( $data [0] [$v] )) {
                        $url = $data [0] [$v];
                        if (false === strpos ( strtolower ( $url ), 'http://' ) && false === strpos ( strtolower ( $url ), 'https://' )) {
                            $data [0] [$v] = $this->SOURCE_PATH . $data [0] [$v];
                        }
                    }
                } else {
                    // 前缀地址,
                    if (empty ( $v ["preUrl"] )) {
                        $preUrl = $this->SOURCE_PATH;
                    } else {
                        $preUrl = $v ["preUrl"];
                    }
                    // 获取元素key,如果是多级的,则用点隔开
                    $fild = $v ["fild"];
                    $filds = array (
                            $fild
                    );
                    $f_data = $data [0];
                    if (strpos ( $fild, "." )) {
                        $filds = explode ( ".", $fild );
                    }
                    try {
                        // 取值
                        foreach ( $filds as $f ) {
                            if (! empty ( $f_data [$f] )) {
                                $f_data = $f_data [$f];
                            } else {
                                continue 2;
                            }
                        }
                        // 处理数据
                        if (! empty ( $f_data ) && false === strpos ( strtolower ( $f_data ), 'http://' ) && false === strpos ( strtolower ( $f_data ), 'https://' )) {
                            $f_data = $preUrl . $f_data;
                        } else {
                            continue;
                        }
                    } catch ( Exception $e ) {
                        continue;
                    }
                    // 赋值
                    $d_out = $f_data;
                    // 反转数组
                    $filds = array_reverse ( $filds );
                    foreach ( $filds as $f ) {
                        $d_out = array (
                                $f => $d_out
                        );
                    }
                    // 合并数组
                    // $data [0] = array_merge_recursive ( $data [0], $d_out );//合并之后,会多一级数组
                    $data [0] = $this->array_replace_recursive ( $data [0], $d_out );
                }
            }
        }
        return $data;
    }

 

调用

$data = $this->build ( $data, array (
                "exe" => array (
                        "replaceImg" => array (
                                "param" => array (
                                            array("preUrl"=>"http://www.xx.com/data/uploads/","fild"=>"type_data.thumburl"),
                                            array("preUrl"=>"http://www.xx.com/data/uploads/","fild"=>"type_data.thumbhaibaourl")
                                        )
                        )
                ),
                "url" => $this->URL_ARR
        ), false );

用到的build方法

public function build($data = array(), $option = array(), $isarray = true) {
        if (! empty ( $data ) && is_array ( $data )) {
            // @todo需要加一个try...catch
            if ($isarray) { // 处理数组
                foreach ( $data as $k => $v ) {
                    if (! empty ( $option ) && is_array ( $option )) {
                        foreach ( $option ["exe"] as $ok => $ov ) {
                            $methods = $ok; // 需要执行的方法
                            $options_build ["url"] = $option ["url"];
                            $options_build ["param"] = $ov ["param"];
                            if (! empty ( $ov ["oData"] )) {
                                $options_build ["oData"] = $ov ["oData"];
                            }
                            $data [$k] = $this->$methods ( $data [$k], $options_build );
                        }
                    }
                }
            } else { // 处理一条数据
                if (! empty ( $option ) && is_array ( $option )) {
                    foreach ( $option ["exe"] as $ok => $ov ) {
                        $methods = $ok; // 需要执行的方法
                        $options_build ["url"] = $option ["url"];
                        $options_build ["param"] = $ov ["param"];
                        if (! empty ( $ov ["oData"] )) {
                            $options_build ["oData"] = $ov ["oData"];
                        }
                        $data = $this->$methods ( $data, $options_build );
                        unset ( $options_build );
                    }
                }
            }
        }
        return $data;
    }

本例子中,需要根据$data的结构修改replaceImg方法中取值项

本例子中,主要特点是能替换多维数组中的内容

$data=array("type_data"=>array("thumbhaibaourl"=>"aaa.png"))

这样写

array("preUrl"=>"http://www.xx.com/data/uploads/","fild"=>"type_data.thumbhaibaourl")

就可以把$data中的aaa.png替换为http://www.xx.com/data/uploads/aaa.png

如果数组在多几级,只要键值type_data.thumbhaibaourl.aaa.bbb.ccc对应,就可以替换啦

 

返回首页