ArrayObject的使用

ArrayObject 类详解
本文介绍了 PHP 中 ArrayObject 类的使用方法,包括不同标志下数组对象的访问与赋值方式,展示了如何利用 ArrayObject 进行数组操作,并列举了常用的 ArrayObject 函数。

ArrayObject是将数组转换为数组对象。可以通过数组的方式访问对象属性。

ArrayObject 类中预定义常量(ArrayObject Flags):

  • ArrayObject::STD_PROP_LIST (默认值)
    只能用数组列表形式,不能用尚需经的形式的进行访问或者赋值。
如,可用$arr['key'],不能用$arr->key的形式进行访问;
可用$arr['key'] = ‘value’,不能用 $arr->key = 'value'的形式进行赋值
  • ArrayObject::ARRAY_AS_PROPS
    即可用数组列表形式,也可用属性的形式进行访问或者赋值。

实例1,数组格式(\ArrayObject::STD_PROP_LIST)

$arr = new \ArrayObject(['name' => 'bar', 'age' => 18]);

或者 $arr = new \ArrayObject(['name' => 'bar', 'age' => 18],  \ArrayObject::STD_PROP_LIST);

print_r($arr);

\ArrayObject(),第二个参数不写,默认就是 \ArrayObject::STD_PROP_LIST
输出

ArrayObject Object
(
    [storage:ArrayObject:private] => Array
        (
            [name] => bar
            [age] => 18
        )

)

访问:

echo $arr['name'] ,输出 bar

echo $arr->name , 不能输出

赋值:

$arr['sex'] = '女';

print_r($arr) 

输出:

barArrayObject Object
(
    [weight] => 65kg
    [storage:ArrayObject:private] => Array
        (
            [name] => bar
            [age] => 18
            [sex] => 女
        )

)

在原来的基础上多了一个 sex 元素

但是以属性方式赋值:

$arr->sex = '女';

print_r($arr)

输出:

ArrayObject Object
(
    [storage:ArrayObject:private] => Array
        (
            [name] => bar
            [age] => 18
        )

)

相比原来没有变化,说明这种方式添加不成功

结论:

设置为 \ArrayObject::STD_PROP_LIST 列表格式时,只能用数组形式进行访问和赋值。

实例2,属性格式(\ArrayObject::ARRAY_AS_PROPS)

$arr = new \ArrayObject(['name' => 'bar', 'age' => 18],  \ArrayObject::ARRAY_AS_PROPS);
$arr['sex'] = '女';
$arr->weight = '50kg';

print_r($arr);

输出:

bar18ArrayObject Object
(
    [storage:ArrayObject:private] => Array
        (
            [name] => bar
            [age] => 18
            [sex] => 女
            [weight] => 50kg
        )
)

结论:

设置为 \ArrayObject::ARRAY_AS_PROPS 属性格式时,即可用属性数组形式进行访问和赋值。

还可以这样

$arr = new \ArrayObject(['name' => 'bar', 'age' => 18],  

\ArrayObject::STD_PROP_LIST|\ArrayObject::ARRAY_AS_PROPS);

两个同时设置

除了上面再第个参数位置上进行设置为,还可以单独设置,如

$arr = new \ArrayObject(['name' => 'bar', 'age' => 18]);
$arr ->setFlags(\ArrayObject::STD_PROP_LIST|\ArrayObject::ARRAY_AS_PROPS);
$arr->prop = 'prop data';
$arr['arr'] = 'array data';
print_r($arr);

代码示例

<?php  //打印全部数组元素
$array =array('1'=>'one', '2'=>'two', '3'=>'three');

$arrayobject = new ArrayObject($array);//构造一个ArrayObject对象
for($iterator= $arrayobject->getIterator();//构造一个迭代器    
$iterator->valid();//检查是否还含有元素    
$iterator->next()){ //指向下个元素    
echo $iterator->key() . ' => ' . $iterator->current() . "\n";//打印数组元素
}
?>

<?php   //重置数组指针
$arrayobject =new ArrayObject();
$arrayobject[] = 'zero';
$arrayobject[] = 'one';
$arrayobject[] = 'two';
$iterator= $arrayobject->getIterator();
$iterator->next();
echo $iterator->key(); // 1
$iterator->rewind(); //重置指针到头部
echo $iterator->key(); // 0
?>

ArrayObject的常用函数

ArrayIterator::current( void ) //返回当前数组元素

ArrayIterator::key(void) //返回当前数组key

ArrayIterator::next (void)//指向下个数组元素

ArrayIterator::rewind(void )//重置数组指针到头

ArrayIterator::seek()//查找数组中某一位置

ArrayIterator::valid()//检查数组是否还包含其他元素

ArrayObject::append()//添加新元素

ArrayObject::__construct()//构造一个新的数组对象

ArrayObject::count()//返回迭代器中元素个数

ArrayObject::getIterator()//从一个数组对象构造一个新迭代器

ArrayObject::offsetExists(mixed index )//判断提交的值是否存在

ArrayObject::offsetGet()//指定 name 获取值

ArrayObject::offsetSet()//修改指定 name 的值

ArrayObject::offsetUnset()//删除数据
给定的参考引用中未提及arrayobject.h文件的相关信息,结合自身知识,`arrayobject.h` 是 NumPy 库中的一个重要头文件,以下是关于它的介绍、用途及使用方法。 ### 介绍 `arrayobject.h` 是 NumPy 为了支持 Python 与 C 语言之间高效交互而提供的一个头文件。NumPy 是 Python 中用于科学计算的基础库,它提供了多维数组对象以及处理这些数组的工具。`arrayobject.h` 使得开发者能够在 C 代码中直接操作 NumPy 数组,从而充分利用 C 语言的高性能进行计算。 ### 用途 - **数据处理**:在 C 代码中直接处理 NumPy 数组,避免了数据在 Python 和 C 之间来回转换的开销,提高了数据处理的效率。例如,对于大规模的数值计算,使用 C 语言结合 `arrayobject.h` 可以显著提升计算速度。 - **算法实现**:将复杂的算法用 C 语言实现,并通过 `arrayobject.h` 与 Python 进行交互。这样可以在 Python 中调用 C 实现的高效算法,同时利用 Python 的便捷性进行数据的输入输出和可视化。 - **扩展 Python 功能**:开发 Python 扩展模块,将 C 代码封装成 Python 可以调用的函数或类,为 Python 增加新的功能。 ### 使用方法 以下是一个简单的示例,展示了如何在 C 代码中使用 `arrayobject.h` 来处理 NumPy 数组: ```c #include <Python.h> #include <numpy/arrayobject.h> // 定义一个函数,用于计算数组中所有元素的和 static PyObject* sum_array(PyObject* self, PyObject* args) { PyArrayObject* arr; double sum = 0.0; int i, n; // 解析输入参数,确保传入的是一个 NumPy 数组 if (!PyArg_ParseTuple(args, "O!", &PyArray_Type, &arr)) { return NULL; } // 获取数组的长度 n = PyArray_SIZE(arr); // 遍历数组,计算所有元素的和 for (i = 0; i < n; i++) { sum += *(double*)PyArray_GETPTR1(arr, i); } // 返回计算结果 return PyFloat_FromDouble(sum); } // 定义模块方法列表 static PyMethodDef myMethods[] = { {"sum_array", sum_array, METH_VARARGS, "Calculate the sum of a NumPy array."}, {NULL, NULL, 0, NULL} }; // 定义模块定义结构体 static struct PyModuleDef myModule = { PyModuleDef_HEAD_INIT, "myModule", "A module for working with NumPy arrays in C.", -1, myMethods }; // 模块初始化函数 PyMODINIT_FUNC PyInit_myModule(void) { // 初始化 NumPy 数组对象 import_array(); return PyModule_Create(&myModule); } ``` ### 编译和使用 将上述代码保存为 `myModule.c`,然后使用以下命令进行编译: ```sh python setup.py build_ext --inplace ``` 其中 `setup.py` 的内容如下: ```python from distutils.core import setup, Extension import numpy as np module = Extension('myModule', sources=['myModule.c'], include_dirs=[np.get_include()]) setup(name='myModule', version='1.0', description='A module for working with NumPy arrays in C.', ext_modules=[module]) ``` 在 Python 中使用编译好的模块: ```python import myModule import numpy as np # 创建一个 NumPy 数组 arr = np.array([1, 2, 3, 4, 5], dtype=np.float64) # 调用 C 实现的函数计算数组元素的和 result = myModule.sum_array(arr) print(result) ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值