PHP使用array_slice之后数组的键被改变的解决方法

今天遇到一个问题,用股票代码作为key的数组在array_slice之后6开头的键值会变成0和1:
array_slice($totalResult, 0, 5);
Array
(
    [000950] => 78.6982
    [000960] => 76.982
    [0] => 76.8926
    [002541] => 76.7676
    [1] => 76.2656
)
在array_slice后面加上第四个参数true之后就正确了:
array_slice($totalResult, 0, 5, true);
Array
(
    [000950] => 78.6982
    [000960] => 76.982
    [600259] => 76.8926
    [002541] => 76.7676
    [600765] => 76.2656
)
array array_slice ( array $array , int $offset [, int $length = NULL [, bool $preserve_keys = false ]] )
的解释:
preserve_keys
注意 array_slice() 默认会重新排序并重置数组的数字索引。你可以通过将 preserve_keys 设为 TRUE 来改变此行为。

PHP判断某个数组中是否存在指定的key

PHP利用array_key_exists()函数判断某个数组中是否存在指定的key,如果该key存在,则返回true,否则返回false。

$search = array('first' => 1, 'second' => 4);
if (array_key_exists('first', $search)) {
    $search['first']++;
}

值得注意的是,以上代码其实可以使用isset来实现:

$search = array('first' => 1, 'second' => 4);
if (isset($search['first'])) {
    $search['first']++;
}

使用isset的好处是isset的速度比array_key_exists()函数要快,因为isset不是函数,PHP能够像if else语句一样直接调用,而array_key_exists()的调用还需要查询PHP的函数库,搜索array_key_exists()函数比较耗时间。虽然如此,isset跟array_key_exists()函数比起来还是有缺陷的,例如:

$search = array('first' => null, 'second' => 4);

isset($search['first']); //返回false

array_key_exists('first', $search); //返回true

通过上面的例子可以看出$search[‘first’]如果等于null的时候,isset就无法发挥作用了。
因此,这两个函数的使用还得分场合,需要大家好好考虑。

C++中sizeof()与strlen()的区别

        终于把Assignment 2做完了,在收尾阶段,遇到了要算char[]类型的长度的问题,我一开始用了sizeof(),后来发现不对,忽然想起来strlen(),用上就对了。其间,我还编了个程序实验了一下,发现这两个函数的区别。

#include
using namespace std;
void main()
{
char st[8];
strcpy(st,"good");
cout<<"sizeof:"<<sizeof(st)<<endl;
cout<<"strlen:"<<strlen(st)<<endl;
system("pause");
}

结果为:

  

 

这就说明sizeof()是计算分配给数组的长度的,因此结果是8;而strlen()是计算数组里装有数据的长度,所以结果是4。

       因此,如果我们要计算一个字符数组的长度的时候,应该使用strlen()函数。

如何实现装有字符串的数组的动态分配空间

一般情况下,我们会这样声明一个已知长度(假设是10)的装有字符串的数组:

char* a[10];

但是我的Assignment里面有两个文件,数组的长度根据文件而定,所以我不能将长度定死,就想到了如何动态分配一个装有字符串的数组的长度,也就是用户输入二维数组的长度。

下面就是我实验的代码:

#include
using namespace std;
void main()
{
	int in;
	char way1[3];
	char way2[3];
	char way3[3];
	cin>>in;
	char** ways=new char*[in];
	for(int i=0;i<in;i++) {
		ways[i]=new char[3];
	}
	strcpy(way1,"111");
	strcpy(way2,"222");
	strcpy(way3,"333");
	ways[0]=way1;
	ways[1]=way2;
	ways[2]=way3;
	for(int i=0;i<in;i++) {
		cout<<ways[i];
	}
	system("pause");
}

这样,就成功的完成了二维数组第一个dimension的动态分配,黑体字部分要注意。

最近对数组指针的理解(请各位大虾指点指点)

最近在《面向对象程序设计基础(第二版)》这本书上看到一节关于指针数组和数组指针的区别,一下是我的理解,例如:

int* prt_array[10];

声明了一个包含10个整数类型指针变量的数组prt_array,也就是说声明了一个数组用来存放int类型的指针。

int (*array_ptr)[10];

声明的是一个指针类型的变量array_ptr,它指向一个长度为10的整数类型数组。

我们知道char ch[10];是一个字符串类型,其实是一个字符类型的数组。那么,一个指向字符串的指针是否就是char (*char_ptr)[10]呢?其实我一开始一直是这么认为的,觉得这样就是一个指针指向了数组的地址了,然后我编译之后发现地址的值是传不进去的,说类型不一样。最后我发现,其实字符串的指针跟字符的指针一样,就是char* char_ptr这样声明的。

以上是我个人的见解,不知道是否如此,如有错误请大家纰漏。

Tonitech版权所有 | 转载请注明出处: http://www.tonitech.com/?p=18