博客

  • QTableWidget清空或删除内容及表头样式内容

    1、清空表格中所有内容

    void QTableWidget::clear() [slot] //清空表格中所有内容(包含表头)
    Removes all items in the view. This will also remove all selections and headers. 
     2、清空表格中的内容(不包含表头)

    void QTableWidget::clearContents() [slot] //清空表格中的内容(不包含表头)。
     Removes all items not in the headers from the view. This will also remove all selections. The table dimensions stay the same.
    3、删除表格中的某行中的某列内容

    void QTableWidget::removeCellWidget(int row, int column) //删除表格中的某行中的某列内容。
     Removes the widget set on the cell indicated by row and column.
    4、删除表格中的某列内容

    void QTableWidget::removeColumn(int column) [slot] //删除表格中的某列内容。
     Removes the column column and all its items from the table.
    5、删除表格中的某行内容

    void QTableWidget::removeRow(int row) [slot] //删除表格中的某行内容。
     Removes the row row and all its items from the table
    6、删除表格中的某行和某列

    QTableWidgetItem * QTableWidget::takeItem(int row, int column) //删除表格中的某行和某列
     Removes the item at row and column from the table without deleting it.
    7、删除表格中的水平标题头

    QTableWidgetItem * QTableWidget::takeHorizontalHeaderItem(int column) //删除表格中的水平标题头
     Removes the horizontal header item at column from the header without deleting it.
    8、删除表格中的垂直标题头

    QTableWidgetItem * QTableWidget::takeVerticalHeaderItem(int row) //删除表格中的垂直标题头
     Removes the vertical header item at row from the header without deleting it.
    9、设置该单元格为屏蔽状态,不能编辑和选中

    ui->tableWidget->item(0,0)->setFlags(Qt::ItemIsEditable);//设置该单元格为屏蔽状态,不能编辑和选中。 
    10、取消表头的在选中单元格时的高亮状态

    ui->tableWidget->horizontalHeader()->setHighlightSections(false);//取消表头的在选中单元格时的高亮状态。
     11、QTableWidget设置为整行选中

    ui->tableWidget->setSelectionBehavior(QAbstractItemView::SelectRows);
    12、设置表头的样式

    ui->tableWidget->horizontalHeader()->setStyleSheet(“image: url(:/img/a.png);image-position:left; “); //设置表头的样式。 
    13、删除QTableWidget自带的行号

    QHeaderView* headerView = ui->tableWidget->verticalHeader();//m_ItemTable为QTableWidget
    headerView->setHidden(true);//隐藏tablewidget自带行号列
    14、设置QTableWidget内容居中

    QTableWidgetItem *item;
    item = new QTableWidgetItem;
    item->setText(userInfo.userId);
    item->setTextAlignment(Qt::AlignCenter);//设置内容对齐方式为垂直和水平居中
    ui->tableWidget->setItem(i, 0, item);
    15、QTableWidget设置最后一列自动填充表格

    ui->tableWidget->horizontalHeader()->setStretchLastSection(true);
    16、QTableWidget隐藏序号列

    QHeaderView* headerView = m_ItemTable->verticalHeader();//隐藏序号列
    headerView->setHidden(true);
    17、QTableWidget设置最后一列自动填充表格

    ui->tableWidget->horizontalHeader()->setStretchLastSection(true); //设置最后一列自动填充表格
    ui->tableWidget->horizontalHeader()->setResizeContentsPrecision(QHeaderView::Stretch);
    18、QTableWidget设置水平表头

    QStringList header;
    header<<"节目编号"<<"节目名称"<<"开始时间"<<"结束时间"<<"创建者"<<"创建时间"<<"审核"<tableWidget->setHorizontalHeaderLabels(header); //设置水平表头
    ui->tableWidget->setColumnWidth(1, 200);//设置第一列宽度
    19、在使用QTableWidget显示图片、文字等信息

    在使用QTableWidget显示图片、文字等信息的时候,有时会遇到这样一种情况:图片或者文字没有填满一整行或一整列。余下的几项是空白的单元格,白占着位置,最关键的是这些Item还可以被选中,在选中项被设成高亮显示的时候就十分的难看,显得很不和谐。如何设置这些空白的单元格,使其看起来就像背景的白板一样呢?

        下面提供解决办法:

    1)、首先空白的单元格要填入一个QTableWidgetItem,这是必要的,因为我们要针对某一个Item操作,而不是QTableWidget。

    2)、通过设置flag,设置Item的属性:使其不可用或者不可选中、不可编辑。

    Qt提供了一个函数(setFlags(Qt::ItemFlags))和一些枚举值来设置这些属性。

    使用方法如下:

    QTableWidgetItem *item = new QTableWidgetItem();
    tabWidget->setItem(2,0,item);
    item->setFlags(item->flags() & ~Qt::ItemIsEnabled & ~Qt::ItemIsSelectable);
    上面用到的两个枚举中:~Qt::ItemIsEnabled可以保证单击该Item时不会被选中,但是在启用Ctrl + A时,全选操作会导致Item被选中。~Qt::ItemIsSelectable的使用可以保证全选状态下也不会被选中,但是在单独使用时出现了虚线框,没有真正实现“不存在”的效果。所以必须两个同用。
    ———————
    作者:WANGZHEN`
    来源:CSDN
    原文:https://blog.csdn.net/qq_16093323/article/details/79226349
    版权声明:本文为博主原创文章,转载请附上博文链接!

  • Qt Creator 中 创建.qss文件

     在网上找了很多资料。但试过之后,都没能实现创建qss文件到Qt项目工程中。一下是从网上看到的资料和自己的总结:

        1、创建Qt项目工程,创建完成后,右键项目工程名称弹出菜单,选择“添加新文件”,此时可以看到新建文件窗口,选择“Qt”项—>选择“Qt资源文件”。此时先不着急输入名称,可以点击“浏览”按钮,打开工程所在的目录下,在此目录下创建名称为“resource”文件夹,选择“resource”文件夹。输入资源名称可为“qss”点击“下一步”–>点击“完成”。

        2、将之前准备好的图片素材放入到“resource”目录下(最好将图片素材放到一个目录下后放入resource中),右键“*.qrc”目录,选择“添加现有文件”—>选择已放入resource目录下的文件。此处注意prefix最好为“/”,否则在调用时会找不到文件。

        3、添加.qss文件。右键“*.qrc”—>选择“add prefix”—>在弹出的窗口中输入“/Qss”。操作完成后,到对应的“resource”目录下创建“Qss”文件夹,并在文件夹内创建扩展名称为”.qss”。即可大功告成。

        4、通过传入路径\文件名称的方式创建一个QFile对象,以readonly的方式打开,然后readAll,最后qApp->setStyleSheet就能够使qss生效。

    实例链接:https://download.csdn.net/download/qq_16093323/10442589

    注意:

           如果图片为jpg或bmp,直接更改扩展名为png会出现无法加载图片的情况,其原因为是通过png文件格式解析图片数据。可通过其他方式将jpg或bmp导出为png格式。Qt也可直接识别jpg图片数据格式。

  • QString与QByteArray互相转换的方法

    // QString转QByteArray方法
    //Qt5.3.2
    QString str(“hello”);
    QByteArray bytes = str.toUtf8(); // QString转QByteArray方法1

    QString str(“hello”);
    QByteArray bytes = str.toLatin1(); // QString转QByteArray方法2

    //QByteArray转QString方法

    //Qt5.3.2
    QByteArray bytes(“hello world”);
    QString string = bytes; // QByteArray转QString方法1

    QByteArray bytes(“hello world”);
    QString string;
    string.prepend(bytes);// QByteArray转QString方法2

    qDebug() << string;
    QByteArray类同样不以’\0’为结尾:如

    QByteArray bytes;
    bytes.resize(5);
    bytes[0] = '1';
    bytes[1] = '2';
    bytes[2] = '3';
    bytes[3] = '\0';
    bytes[4] = 'a';

    cout << bytes << endl;

  • PHP krsort() 函数

    PHP krsort() 函数

    实例

    对关联数组按照键名进行降序排序:

    <?php
    $age=array("Peter"=>"35","Ben"=>"37","Joe"=>"43");
    krsort($age);
    ?>
    

    运行结果:

    Key=Peter, Value=35
    Key=Joe, Value=43
    Key=Ben, Value=37

    定义和用法

    krsort() 函数对关联数组按照键名进行降序排序。

    提示:请使用 ksort() 函数对关联数组按照键名进行升序排序。

    提示:请使用 arsort() 函数对关联数组按照键值进行降序排序。

    提示:请使用 asort() 函数对关联数组按照键值进行升序排序。

  • PHP dirname() 函数

    PHP dirname() 函数

    实例

    <?php
    echo dirname("c:/testweb/home.php") . "<br />";
    echo dirname("/testweb/home.php");
    ?>
    

    上面的代码将输出:

    c:/testweb
    /testweb

    定义和用法

    dirname() 函数返回路径中的目录名称部分。

  • PHP basename() 函数

    PHP basename() 函数

    实例

    <?php
    $path = "/testweb/home.php";
    
    //Show filename with file extension
    echo basename($path) ."<br/>";
    
    //Show filename without file extension
    echo basename($path,".php");
    ?>
    

    上面的代码将输出:

    home.php
    home

    定义和用法

    basename() 函数返回路径中的文件名部分。

  • PHP trim() 函数

    PHP trim() 函数

    实例

    移除字符串左侧的字符("Hello" 中的 "He"以及 "World" 中的 "d!"):

    <?php
    $str = "Hello World!";
    echo $str . "<br>";
    echo trim($str,"Hed!");
    ?>
    

     

    定义和用法

    trim() 函数移除字符串两侧的空白字符或其他预定义字符。

    相关函数:

    • ltrim() – 移除字符串左侧的空白字符或其他预定义字符。
    • rtrim() – 移除字符串右侧的空白字符或其他预定义字符。

    实例1

    移除字符串两侧的空格:

    <?php
    $str = " Hello World! ";
    echo "Without trim: " . $str;
    echo "<br>";
    echo "With trim: " . trim($str);
    ?>
    

     

    上面代码的 HTML 输出如下(查看源代码):

    <!DOCTYPE html>
    <html>
    <body>
    
    Without trim: Hello World! <br>With trim: Hello World!
    </body>
    </html>
    

     

    上面代码的浏览器输出如下:

    Without trim: Hello World!
    With trim: Hello World!
    

     

    实例2

    移除字符串两侧的换行符(\n):

    <?php
    $str = "nnnHello World!nnn";
    echo "Without trim: " . $str;
    echo "<br>";
    echo "With trim: " . trim($str);
    ?>
    

     

    上面代码的 HTML 输出如下(查看源代码):

    <!DOCTYPE html>
    <html>
    <body>
    
    Without trim:
    
    
    Hello World!
    
    
    <br>With trim: Hello World!
    </body>
    </html>
    

     

    上面代码的浏览器输出如下:

    Without trim: Hello World!
    With trim: Hello World!
    

     

  • Qt信号与槽实现原理

    本文使用 ISO C++ 一步一步实现了一个极度简化的信号与槽的系统 (整个程序4个文件共121行代码) 。希望能有助于刚进入Qt世界的C++用户理解Qt最核心的信号槽与元对象系统是如何工作的。

    另:你可能会对 从 C++ 到 Qt 一文感兴趣

    dbzhang800 2011.04.30

    注:Qt5 staging仓库已经引入一种全新的信号与槽的语法:信号可以和普通的函数、类的普通成员函数、lambda函数连接(而不再局限于信号函数和槽函数),详见 信号与槽的新语法(Qt5) dbzhang800 2011.06.15

    Qt信号与槽

    GUI程序中,当我们我们点击一个按钮时,我们会期待我们自定义的某个函数被调用。对此,较老的工具集(toolkits)都是通过回调函数(callback)来实现的,Qt的神奇之处就在于,它使用信号(signal)与槽(slot)的技术来取代了回调。

    在继续之前,我们先看一眼最最常用的 connnect 函数:

    connect(btn, "2clicked()", this, "1onBtnClicked()")
    可能你会觉得稍有点眼生,因为为了清楚起见,我没有直接使用大家很熟悉的SIGNAL和SLOT两个宏,宏定义如下:

    # define SLOT(a) "1"#a
    # define SIGNAL(a) "2"#a

    程序运行时,connect借助两个字符串,即可将信号与槽的关联建立起来,那么,它是如果做到的呢?C++的经验可以告诉我们:

    类中应该保存有信号和槽的字符串信息
    字符串和信号槽函数要关联
    而这,就是通过神奇的元对象系统所实现的(Qt的元对象系统预处理器叫做moc,对文件预处理之后生成一个moc_xxx.cpp文件,然后和其他文件一块编译即可)。

    接下来,我们不妨尝试用纯C++来实现自己的元对象系统(我们需要有一个自己的预处理器,本文中用双手来代替了,预处理生成的文件是db_xxx.cpp)。

    继续之前,我们可以先看一下我们最终的类定义

    class Object
    {
    DB_OBJECT
    public:
    Object();
    virtual ~Object();
    static void db_connect(Object *, const char *, Object *, const char *);
    void testSignal();
    db_signals:
    void sig1();
    public db_slots:
    void slot1();
    friend class MetaObject;
    private:
    ConnectionMap connections;
    };

    引入元对象系统

    首先定义自己的信号和槽

    为了和普通成员进行区别(以使得预处理器可以知道如何提取信息),我们需要创造一些"关键字"
    db_signals
    db_slots
    class Object
    {
    public:
    Object();
    virtual ~Object();
    db_signals:
    void sig1();
    public db_slots:
    void slot1();
    };
    通过自己的预处理器,将信息提取取来,放置到一个单独的文件中(比如db_object.cpp):
    规则很简单,将信号和槽的名字提取出来,放到字符串中。可以有多个信号或槽,按顺序"sig1/nsig2/n"
    static const char sig_names[] = "sig1/n";
    static const char slts_names[] = "slot1/n";
    这些信号和槽的信息,如何才能与类建立关联,如何被访问呢?
    我们可以定义一个类,来存放信息:

    struct MetaObject
    {
    const char * sig_names;
    const char * slts_names;
    };
    然后将其作为一个Object的静态成员(注意哦,这就是我们的元对象啦 ):

    class Object
    {
    static MetaObject meta;

    这样一来,我们的预处理器可以生成这样的 db_object.cpp 文件:

    #include "object.h"

    static const char sig_names[] = "sig1/n";
    static const char slts_names[] = "slot1/n";
    MetaObject Object::meta = {sig_names, slts_names};
    信息提取的问题解决了:可是,还有一个严重问题,我们定义的关键字 C++ 编译器不认识啊,怎么办?

    呵呵,好办,通过定义一下宏,问题是不是解决了:

    # define db_slots
    # define db_signals protected

    建立信号槽链接

    我们的最终目的就是:当信号被触发的时候,能找到并触发相应的槽。所以有了信号和槽的信息,我们就可以建立信号和槽的连接了。我们通过 db_connect 将信号和槽的对应关系保存到一个 mutlimap 中:

    struct Connection
    {
    Object * receiver;
    int method;
    };

    class Object
    {
    public:

    static void db_connect(Object*, const char*, Object*, const char*);

    private:
    std::multimap connections;
    上面应该不需要什么解释了,我们直接看看db_connect该怎么写:

    void Object::db_connect(Object* sender, const char* sig, Object* receiver, const char* slt)
    {
    int sig_idx = find_string(sender->meta.sig_names, sig);
    int slt_idx = find_string(receiver->meta.slts_names, slt);
    if (sig_idx == -1 || slt_idx == -1) {
    perror("signal or slot not found!");
    } else {
    Connection c = {receiver, slt_idx};
    sender->connections.insert(std::pair(sig_idx, c));
    }
    }
    首先从元对象信息中查找信号和槽的名字是否存在,如果存在,则将信号的索引和接收者的信息存入信号发送者的的一个map中。如果信号或槽无效,就什么都不用做了。

    我们这儿定义了一个find_string函数,就是个简单的字符串查找(此处就不列出了)。

    信号的激活

    连接信息有了,我们看看信号到底是怎么发出的。

    在 Qt 中,我们都知道用 emit 来发射信号:

    class Object
    {
    public:
    void testSignal()

    };

    void Object::testSignal()
    {
    db_emit sig1();
    }
    这儿 db_emit 是神马东西?C++编译器不认识啊,没关系,看仔细喽,加一行就行了

    #define db_emit
    从前面我的Object定义中可以看到,所谓的信号或槽,都只是普普通通的C++类的成员函数。既然是成员函数,就需要函数定义:

    槽函数:由于它包含我们需要的功能代码,我们都会想到在 object.cpp 文件中去定义它,不存在问题。
    信号函数:它的函数体不需要自己编写。那么它在哪儿呢?这就是本节的内容了
    信号函数由我们的"预处理器"来生成,也就是它要定义在我们的 db_object.cpp 文件中:

    void Object::sig1()
    {
    MetaObject::active(this, 0);
    }
    我们预处理源文件时,就知道它是第几个信号。所以根据它的索引去调用和它关联的槽即可。具体工作交给了MetaObject类:

    class Object;
    struct MetaObject
    {
    const char * sig_names;
    const char * slts_names;

    static void active(Object * sender, int idx);
    };
    这个函数该怎么写呢:思路很简单

    从前面的保存连接的map中,找出与该信号关联的对象和槽
    调用该对象这个槽
    typedef std::multimap ConnectionMap;
    typedef std::multimap::iterator ConnectionMapIt;

    void MetaObject::active(Object* sender, int idx)
    {
    ConnectionMapIt it;
    std::pair ret;
    ret = sender->connections.equal_range(idx);
    for (it=ret.first; it!=ret.second; ++it) {
    Connection c = (*it).second;
    //c.receiver->metacall(c.method);
    }
    }
    补遗:

    槽的调用

    这个最后一个关键问题了,槽函数如何根据一个索引值进行调用。

    直接调用槽函数我们都知道了,就一个普通函数
    可现在通过索引调用了,那么我们必须定义一个接口函数
    class Object
    {
    void metacall(int idx);

    该函数如何实现呢?这个又回到我们的元对象预处理过程中了,因为在预处理的过程,我们能将槽的索引和槽的调用关联起来。

    所以,在预处理生成的文件(db_object.cpp)中,我们很容易生成其定义:

    void Object::metacall(int idx)
    {
    switch (idx) {
    case 0:
    slot1();
    break;
    default:
    break;
    };
    }
    至此,我们已经实现的一个简化的自己的信号与槽的程序。下面我们总体上看看程序的所有代码:

    全家福

    类定义文件 object.h
    #ifndef DB_OBJECT
    #define DB_OBJECT
    #include

    # define db_slots
    # define db_signals protected
    # define db_emit
    class Object;
    struct MetaObject
    {
    const char * sig_names;
    const char * slts_names;
    static void active(Object * sender, int idx);
    };
    struct Connection
    {
    Object * receiver;
    int method;
    };
    typedef std::multimap ConnectionMap;
    typedef std::multimap::iterator ConnectionMapIt;
    class Object
    {
    static MetaObject meta;
    void metacall(int idx);
    public:
    Object();
    virtual ~Object();
    static void db_connect(Object*, const char*, Object*, const char*);
    void testSignal();
    db_signals:
    void sig1();
    public db_slots:
    void slot1();
    friend class MetaObject;
    private:
    ConnectionMap connections;
    };
    #endif
    类实现文件 object.cpp
    #include
    #include
    #include "object.h"
    Object::Object()
    {
    }
    Object::~Object()
    {
    }
    static int find_string(const char * str, const char * substr)
    {
    if (strlen(str) meta.sig_names, sig);
    int slt_idx = find_string(receiver->meta.slts_names, slt);
    if (sig_idx == -1 || slt_idx == -1) {
    perror("signal or slot not found!");
    } else {
    Connection c = {receiver, slt_idx};
    sender->connections.insert(std::pair(sig_idx, c));
    }
    }
    void Object::slot1()
    {
    printf("hello dbzhang800!");
    }
    void MetaObject::active(Object* sender, int idx)
    {
    ConnectionMapIt it;
    std::pair ret;
    ret = sender->connections.equal_range(idx);
    for (it=ret.first; it!=ret.second; ++it) {
    Connection c = (*it).second;
    c.receiver->metacall(c.method);
    }
    }
    void Object::testSignal()
    {
    db_emit sig1();
    }
    我们自己的预处理需要生成这样一个文件 db_object.cpp
    注意看这个文件:其实内容非常简单
    将信号和槽的信息存放到字符串中 ==>按顺序排放,所以有了索引值
    信号发射 其实就是 信号函数==> 信号的索引
    metacall 其实就是 槽的索引==> 槽函数
    #include "object.h"
    static const char sig_names[] = "sig1/n";
    static const char slts_names[] = "slot1/n";
    MetaObject Object::meta = {sig_names, slts_names};
    void Object::sig1()
    {
    MetaObject::active(this, 0);
    }
    void Object::metacall(int idx)
    {
    switch (idx) {
    case 0:
    slot1();
    break;
    default:
    break;
    };
    }
    最后,我们可以写一个小小的例子main.cpp :
    #include "object.h"
    int main()
    {
    Object obj1, obj2;
    Object::db_connect(&obj1, "sig1", &obj2, "slot1");
    obj1.testSignal();
    return 0;;
    }
    程序的编译就不用多数了,用你熟悉的msvc或者g++
    cl main.cpp object.cpp db_object.cpp -o dbzhang800
    g++ main.cpp object.cpp db_object.cpp -o dbzhang800
    零零散散,写在后面

     

    我不确定是不是已经元对象系统和信号槽最基本的概念表达清楚了。反正我想,如果你对Qt感兴趣,相对Qt的信号和槽进一步的了解,但是目前尚对阅读Qt的源码觉得无比恐怖,本文可能会对你有帮助。

    文中将东西精简到我个人能做到的极限了,所以有很多很多没提到的东西:

    Q_OBJECT

    用Qt,我们都知道这个宏,可是我们前面压根没提。因为我怕打乱思路,这儿补上吧。我的前面的代码可以替换为:

    # define DB_OBJECT static MetaObject meta; void metacall(int idx);

    class Object
    {
    DB_OBJECT
    DB_OBJECT 还可以作为一个标记:如果我们写好了自己的类似于Qt中的moc的预处理器,如何判断一个文件是否需要预处理来生成 db_object.cpp 文件呢?此时就可以根据类定义中是否有宏来判断。

    题外: 为什么添加宏后会容易遇到链接错误?你能看到原因么?因为它展开后就是类的成员,可是其定义要通过预处理进行生成。如果你没有运行预处理器,也就没有 db_object.cpp 这种文件,肯定要出错了。

    Connection

    我们前面在Connection只保存了接收者的指针和槽的索引,我们可以保存更多一点的信息的:可以看看Qt保存了哪些东西

    QObjectPrivate::Connection *c = new QObjectPrivate::Connection;
    c->sender = s;
    c->receiver = r;
    c->method = method_index;
    c->connectionType = type;
    c->argumentTypes = types;
    c->nextConnectionList = 0;
    应该很容易看懂,不做解释了。

    Qt中信号和槽主要有直接连接和队列连接两种方式,我们这儿只提到了前者,后者和Qt的事件系统搅和在一起。只要搞清楚了Qt事件系统,就会发现和直接连接没有什么区别了。

    其他

    信号和槽的参数

    这个,例子中举的都是信号和槽都是无参数的例子。加上参数,尽管概念上没变化,但复杂度就大大提高了。所以本文对此不想涉及,也没必要吧,直接去看Qt的源码吧。

    信号和信号连接

    信号和槽一样,都可以被调用,本例进行扩展也很容易,需要metacall那个函数,以及信号和槽要加个区别的标记(回到最前面不妨看看Qt的SLOT和SIGNAL究竟是神马东西)。

     

  • PHP implode() 函数

    PHP implode() 函数

    实例

    把数组元素组合为一个字符串:

    <?php
    $arr = array('Hello','World!','Beautiful','Day!');
    echo implode(" ",$arr);
    ?>
    

    定义和用法

    implode() 函数返回一个由数组元素组合成的字符串。

    注释:implode() 函数接受两种参数顺序。但是由于历史原因,explode() 是不行的,您必须保证 separator 参数在 string 参数之前才行。

    注释:implode() 函数的 separator 参数是可选的。但是为了向后兼容,推荐您使用使用两个参数。

    注释:该函数是二进制安全的。

    更多实例

    用不同的字符分离数组元素:

    <?php
    $arr = array('Hello','World!','Beautiful','Day!');
    echo implode(" ",$arr)."<br>";
    echo implode("+",$arr)."<br>";
    echo implode("-",$arr)."<br>"; 
    echo implode("X",$arr);
    ?>
    

  • PHP explode() 函数

    PHP explode() 函数

    实例

    把字符串打散为数组:

    <?php 
    $str = "www.runoob.com"; 
    print_r (explode(".",$str)); 
    ?>
    

     

    定义和用法

    explode() 函数使用一个字符串分割另一个字符串,并返回由字符串组成的数组。

    注释:"separator" 参数不能是一个空字符串。

    注释:该函数是二进制安全的。

    更多实例

    使用 limit 参数来返回一些数组元素:

    <?php
    $str = 'one,two,three,four';
     
    //  返回包含一个元素的数组
    print_r(explode(',',$str,0));
    print "<br>";
     
    // 数组元素为 2
    print_r(explode(',',$str,2));
    print "<br>";
     
    // 删除最后一个数组元素
    print_r(explode(',',$str,-1));
    ?>