来自isset()文档:
isset() will return FALSE if testing a variable that has been set to NULL.
Run Code Online (Sandbox Code Playgroud)
基本上,isset()不检查变量是否设置,但是否设置为除了NULL.
鉴于此,实际检查变量是否存在的最佳方法是什么?我尝试过类似的东西:
if(isset($v) || @is_null($v))
Run Code Online (Sandbox Code Playgroud)
(这@是必要的,以避免$v未设置时的警告)但is_null()有一个类似的问题isset():它返回未TRUE设置的变量!它似乎也是:
@($v === NULL)
Run Code Online (Sandbox Code Playgroud)
工作完全一样@is_null($v),所以也是这样.
我们如何可靠地检查PHP中是否存在变量?
编辑:在未设置的变量和设置为的变量之间,PHP显然存在差异NULL:
<?php
$a = array('b' => NULL);
var_dump($a);
Run Code Online (Sandbox Code Playgroud)
PHP显示$a['b']存在,并且具有NULL值.如果你添加:
var_dump(isset($a['b']));
var_dump(isset($a['c']));
Run Code Online (Sandbox Code Playgroud)
你可以看到我正在谈论的isset()功能歧义.以下是所有这三个的输出var_dump()s:
array(1) {
["b"]=>
NULL
}
bool(false)
bool(false)
Run Code Online (Sandbox Code Playgroud)
进一步编辑:两件事.
一,用例.将数组转换为SQL UPDATE语句的数据,其中数组的键是表的列,数组的值是要应用于每列的值.任何表的列都可以保存一个NULL值,通过 …
我的难题一般来说是:通过GridView之外的一些动作,我想根据之前选择的特定模型项或索引来计算GridView中特定委托项的坐标.
我有一个GridView,其中有许多项目在模型中.GridView的委托创建每个项目的缩略图视图.单击时,它会显示项目的详细全屏视图.我想要一个很好的转换,它显示缩略图从GridView中的位置扩展出来,当详细视图被解除时,缩小回到GridView中.
诀窍是,详细视图本身就是ListView的委托,因此您可以一次在一个屏幕之间在详细视图之间进行分页.这意味着只需调整GridView的委托项目大小或某些内容的解决方案将无效.此外,由于您可以寻呼到ListView中的任何项目,因此必须仅基于模型中可用的信息或模型项目的索引来返回GridView(例如,我无法存储用于启动的模拟项目的鼠标的坐标.详细的观点或东西).
扩展动画相当简单,因为委托项具有一个用于知道其自身位置的单击处理程序的MouseArea,因此可以将其传递给启动动画的函数.这是我无法弄清楚的反过来:从ListView中的模型项/索引,我如何计算GridView中相关项的坐标?
我在文档中找不到任何似乎可以让您从模型项实例甚至索引访问委托项实例的内容.GridView具有indexAt()基于坐标返回索引的功能.我想我可以反过来做,但它似乎不存在.
这是一个更具体的例子.道歉; 这是我能想出的最准确的代码,它准确地描述了我的问题:
import QtQuick 1.1
Item {
id: window
width: 400
height: 200
state: "summary"
states: [
State { name: "summary"; },
State { name: "details"; }
]
transitions: [
Transition { from: "summary"; to: "details";
SequentialAnimation {
PropertyAction { target: animationRect; property: "visible"; value: true; }
ParallelAnimation {
NumberAnimation { target: animationRect; properties: "x,y"; to: 0; duration: 200; }
NumberAnimation { target: animationRect; property: "width"; to: 400; duration: 200; }
NumberAnimation { …Run Code Online (Sandbox Code Playgroud) 背景
我正在对存储在SQLite中的一组电子邮件进行全文搜索,利用其出色的内置FTS4引擎.虽然不完全符合我的预期,但我的查询性能相当差.让我们来看看.
代表架构
我将提供一些有关代码的简化示例,并在适用的地方提供完整代码的链接.
我们有一个MessageTable存储有关电子邮件消息的数据(完整版本分布在几个文件,这里,这里和这里):
CREATE TABLE MessageTable (
id INTEGER PRIMARY KEY,
internaldate_time_t INTEGER
);
CREATE INDEX MessageTableInternalDateTimeTIndex
ON MessageTable(internaldate_time_t);
Run Code Online (Sandbox Code Playgroud)
可搜索的文本被添加到名为MessageSearchTable(此处为完整版)的FTS4表中:
CREATE VIRTUAL TABLE MessageSearchTable USING fts4(
id INTEGER PRIMARY KEY,
body
);
Run Code Online (Sandbox Code Playgroud)
该id搜索表作为一个外键消息表.
我将把它作为练习让读者在这些表格中插入数据(我当然不能透露我的私人电子邮件).我每张桌子的记录不到26k.
问题查询
当我们检索搜索结果时,我们需要按顺序对它们进行排序,internaldate_time_t这样我们才能获取最新的几个结果.这是一个示例搜索查询(此处为完整版):
SELECT id
FROM MessageSearchTable
JOIN MessageTable USING (id)
WHERE MessageSearchTable MATCH 'a'
ORDER BY internaldate_time_t DESC
LIMIT 10 OFFSET 0
Run Code Online (Sandbox Code Playgroud)
在我的机器上,通过我的电子邮件,运行大约150毫秒,通过以下方式测量:
time …Run Code Online (Sandbox Code Playgroud) 背景:
我正在编写一个进行TCP/IP连接的守护进程.它将在具有多个(非环回)IP地址的计算机上运行.我希望用户能够在守护程序的配置文件中指定用于传出连接的IP地址,或者*使用all.
地址将用于轮换,每个连接从最近最少使用的IP地址发出.这种行为很重要,因为它*是"all"的替代品,因此在多台机器上运行的守护程序可以指向文件共享上的相同配置文件,并且每个守护程序都使用自己的一组IP地址.
问题:
如何获取机器可以传出(即连接到任何其他计算机)连接的所有IP地址列表?给定所有IP地址的列表,我将如何过滤掉环回地址?
我在C中,如果可能的话我只想使用POSIX,但守护进程可能只能在Linux机器上运行,所以我接受一个以Linux为中心的答案.
每个IP地址都可以在一个(可能是虚拟的)网络设备上使用,反之亦然,因此枚举网络设备和获取相关IP地址的方法也足够了,尽管我对此并不满意.(附带问题:甚至可以将多个IP地址与单个设备关联起来吗?多个设备下的相同IP怎么样?不重要.)
解决方案不足:
gethostname()/ gethostbyname()(作为这个问题).使用该方法,我只返回127.0.0.1(或Debian中的.1.1).我怀疑这是因为机器的主机名在hosts文件中,这就是gethostbyname()检查.(我相信这就是为什么在Debian中我总是得到127.0.1.1:Debian默认将localhost添加为127.0.0.1并将机器的主机名添加为127.0.1.1到hosts文件中,对吧?)我想要一个忽略hosts并给我一切的解决方案实际上在那里getaddrinfo()比gethostname()/ 更幸运了gethostbyname().它似乎受到同样问题的约束.我测试了这个,将机器的主机名和NULL服务(端口)传递给它; 文档说传递NULL主机名和NULL服务是非法的,这是通过测试来支持的.不知道怎么回答机器上的所有问题,但是我愿意接受这方面的建议.最后的编辑:我已经接受了卡斯基的答案给了他一个功劳,因为我指的是如何做到这一点的方向.我已经发布了自己的答案,列出了如果有其他人需要它的确切方法的源代码.