有没有一种很好的方法来迭代字符串的字符?我希望能够做到foreach,array_map,array_walk,array_filter等一个字符串的字符.
类型转换/杂耍没有让我到处(将整个字符串作为数组的一个元素),我发现的最佳解决方案是使用for循环来构造数组.感觉应该有更好的东西.我的意思是,如果你可以索引它,你应该不能迭代吗?
这是我得到的最好的
function stringToArray($s)
{
$r = array();
for($i=0; $i<strlen($s); $i++)
$r[$i] = $s[$i];
return $r;
}
$s1 = "textasstringwoohoo";
$arr = stringToArray($s1); //$arr now has character array
$ascval = array_map('ord', $arr); //so i can do stuff like this
$foreach ($arr as $curChar) {....}
$evenAsciiOnly = array_filter( function($x) {return ord($x) % 2 === 0;}, $arr);
Run Code Online (Sandbox Code Playgroud)
有没有:
A)使字符串可迭代的一种方法
B)从字符串构建字符数组的更好方法(如果是这样,另一个方向怎么样?)
我觉得我错过了一些明显的东西.
我看到PHP 5.4的新计划功能是:traits,array dereferencing,JsonSerializable接口和称为' closure $this support'的东西
http://en.wikipedia.org/wiki/Php#Release_history
虽然其他人要么立即清楚(JsonSerialiable,阵列解除引用),要么我查找具体(特征),我不确定'封闭$这个支持'是什么.我在谷歌搜索它或在php.net上找到任何关于它的任何东西都没有成功
有谁知道这应该是什么?
如果我不得不猜测,那就意味着:
$a = 10; $b = 'strrrring';
//'old' way, PHP 5.3.x
$myClosure = function($x) use($a,$b)
{
if (strlen($x) <= $a) return $x;
else return $b;
};
//'new' way with closure $this for PHP 5.4
$myNewClosure = function($x) use($a as $lengthCap,$b as $alternative)
{
if(strlen($x) <= $this->lengthCap)) return $x;
else
{
$this->lengthCap++; //lengthcap is incremented for next time around
return $this->alternative;
}
};
Run Code Online (Sandbox Code Playgroud)
重要性(即使这个例子是微不足道的)是在过去一旦构造了闭包,绑定的"使用"变量是固定的.通过'关闭$ this support',他们更像是你可以搞砸的成员.
这听起来是否正确和/或接近和/或合理?有谁知道这个'封闭$这个支持'是什么意思?
有没有办法使用的方式let,where或者定义的子表达式列表中的理解,使其既可以在术语和约束使用吗?
从我的实验,以下工作:
[let x = i*i in x | i<-[1..10], i*i > 20] --good
[i*i | i<-[1..10], let x=i*i in x > 20] --good
Run Code Online (Sandbox Code Playgroud)
但这些不是范围:
[let x = i*i in x | i<-[1..10], x > 20] -- 'x' not in scope error
let x = i*i in [x | i<-[1..10], x > 20] -- 'i' not in scope error
[x | i<-[1..10], x > 20] where x = i*i --parse error on 'where'
Run Code Online (Sandbox Code Playgroud)
所以let在一个地方或另一个地方工作,但不是两个在一起! …
我总是觉得有一个函数或表达式需要在Haskell中使用列表(或数组,应用相同)的值以及索引,这很难.
我validQueens在这里尝试N皇后问题时写下了 ......
validQueens x =
and [abs (x!!i - x!!j) /= j-i | i<-[0..length x - 2], j<-[i+1..length x - 1]]
Run Code Online (Sandbox Code Playgroud)
我不关心使用索引,所有的加号和减号等.它感觉马虎.我想出了以下内容:
enumerate x = zip [0..length x - 1] x
validQueens' :: [Int] -> Bool
validQueens' x = and [abs (snd j - snd i) /= fst j - fst i | i<-l, j<-l, fst j > fst i]
where l = enumerate x
Run Code Online (Sandbox Code Playgroud)
受到Python的启发enumerate(不是借用命令式概念必然是一个好主意).似乎在概念好,但snd和fst所有的地方还挺吮吸.至少乍一看,它在时间和空间上都是昂贵的.我不确定我是否更喜欢它.
简而言之,我对这两者都不满意
有没有人发现他们发现比上述任何一种更优雅的模式?如果没有,是否有任何令人信服的理由,上述方法之一是优越的?
我不太熟悉Haskell/GHC可以优化代码的程度.下面我有一个非常"蛮力"(在声明意义上)实施n皇后问题.我知道它可以更有效地编写,但那不是我的问题.这让我想到了GHC优化功能和限制.
我已经在我认为非常简单的陈述性意义中表达了这一点.过滤满足谓词的[1..n]的排列For all indices i,j s.t j<i, abs(vi - vj) != j-i 我希望这是可以优化的东西,但它也有点像要求很多编译器.
validQueens x = and [abs (x!!i - x!!j) /= j-i | i<-[0..length x - 2], j<-[i+1..length x - 1]]
queens n = filter validQueens (permutations [1..n])
oneThru x = [1..x]
pointlessQueens = filter validQueens . permutations . oneThru
main = do
n <- getLine
print $ pointlessQueens $ (read :: String -> Int) n
Run Code Online (Sandbox Code Playgroud)
这种运行速度相当慢并且增长很快. n=10需要大约一秒钟,n=12需要永远.如果没有优化,我可以判断增长是因子(排列数)乘以二次方(要检查的谓词中的差异数).有没有什么办法可以通过智能编译更好地执行此代码?我尝试了ghc这样的基本选项-O2并没有注意到显着的差异,但我不知道更精细的点(只是添加了标志)
我的印象是我调用的函数queens无法优化,必须在过滤之前生成所有排列.无点版本有更好的机会吗?一方面,我觉得过滤器和谓词之间的智能功能理解可能能够在它们甚至完全生成之前敲掉一些明显不受欢迎的元素,但另一方面,它有点像是要感觉很多. …
我正在通过脚本自动添加Twitter提要.我想在其中添加一个<br/>带有jquery的东西.现在就是这样
<ul id="twitter_update_list">
<li><span>something</span> <a href="#">about 4 hours ago</a></li>
<li><span>something</span> <a href="#">about 6 hours ago</a></li>
</ul>
Run Code Online (Sandbox Code Playgroud)
我想用jquery <br/>之后添加一个</span>.所以它就像这样
<ul id="twitter_update_list">
<li><span>something</span><br/> <a href="#">about 4 hours ago</a></li>
<li><span>something</span><br/> <a href="#">about 6 hours ago</a></li>
</ul>
Run Code Online (Sandbox Code Playgroud) 我正在尝试在haskell中编写一个hyperoperation函数.
它通常是写的,ackermann(a,b,n)但对于部分应用目的,我认为n放在第一位更有意义.因此,我称之为hypOp n a b
我发现最自然的形式折叠ao replicate列表如下:
Prelude> replicate 3 5
[5,5,5]
Prelude> foldr1 (*) $ replicate 3 5
125
Run Code Online (Sandbox Code Playgroud)
根据折叠的函数参数,这可以是加法,多重,取幂,四元组等.
非正式概述:
hypOp 0 a _ = succ a
hypOp 1 a b = a + b = foldr1 (succ a) (replicate b a) --OFF BY ONE ISSUES, TYPE ISSUES
hypOp 2 a b = a * b = foldr1 (+) $ replicate b a
hypOp 3 a b = a ^ b = …Run Code Online (Sandbox Code Playgroud) 我正在阅读这个页面 http://dev.mysql.com/doc/refman/5.0/en/mysql-fetch-row.html 有一行
printf("[%.*s] ", (int) lengths[i],
row[i] ? row[i] : "NULL");
Run Code Online (Sandbox Code Playgroud)
来自代码
MYSQL_ROW row;
unsigned int num_fields;
unsigned int i;
num_fields = mysql_num_fields(result);
while ((row = mysql_fetch_row(result)))
{
unsigned long *lengths;
lengths = mysql_fetch_lengths(result);
for(i = 0; i < num_fields; i++)
{
printf("[%.*s] ", (int) lengths[i],
row[i] ? row[i] : "NULL");
}
printf("\n");
Run Code Online (Sandbox Code Playgroud)
}
[%.*s]那段代码意味着什么?
我想获得浏览器窗口的大小$(window).width()和$(window).height()功能.但是这两个返回null.在$(window)不为空,它返回"对象".我也试过使用$(document).width()和$(document).height(),这两个不返回null,它们返回特定值,但它们大于窗口大小.知道为什么$window2个值为空?
$(window).load(function () {
var view = $("#view");
var image = $("#image");
var hiResImage = $("#hi-res-image");
var zoom = $("<a id='zoom'><span><br /></span></a>");
log("ERROR 1 = " + $(window).width());
log("ERROR 1 = " + $(window).height());
log("ERROR 1 = " + $(window));
image.width($(window).width());
image.height($(window).height());
Run Code Online (Sandbox Code Playgroud)
.....
我应该初始化somw $(window)变量怎么样?
我想检查会话变量.最好的情况在firebugs小解释器工作,但如果我必须把它放在文件中,那很好.现在我只是做了一个简短的PHP来输出$ _SESSION,但是如果我能找到类似于在浏览器中完成的东西,那将是理想的.document.cookie似乎没有做我正在寻找的东西,至少不是我所看到的.
基本上寻找类似于$ _SESSION的东西,我可以在javascript中使用
编辑 - 试图看看我是否可以得到更多,或提取意义PHPSESSID = o147cf52u9d7qr251hc3n6ilu2; 客户端的ASESSIONID = 101wvpe-3FA77F204CFF55BA61E696AD3F62F0F8.就目前而言,我想我可以将一个小的ajax函数写入回显会话的url.谢谢您的帮助!
PS - 那些document.cookie值与会话中的内容有什么关系,还是只是标识符来告诉另一个会话?