// Suppose result is the end product from some query $query
$result = $mysqli->query($query);
$result = db_result_to_array($result);
function db_result_to_array($result)
{
$res_array = array();
for ($count=0; $row = $result->fetch_assoc(); $count++)
$res_array[$count] = $row;
return $res_array;
}
4
有我的建议,如果你的对象甚至包含私人成员:
public function dismount($object) {
$reflectionClass = new \ReflectionClass(get_class($object));
$array = array();
foreach ($reflectionClass->getProperties() as $property) {
$property->setAccessible(true);
if (is_object($property->getValue($object))) {
$array[$property->getName()] = $this->dismount($property->getValue($object));
} else {
$array[$property->getName()] = $property->getValue($object);
}
$property->setAccessible(false);
}
return $array;
}
0
对“井”代码的一些改进
/*** mixed Obj2Array(mixed Obj)***************************************/
static public function Obj2Array($_Obj) {
if (is_object($_Obj))
$_Obj = get_object_vars($_Obj);
return(is_array($_Obj) ? array_map(__METHOD__, $_Obj) : $_Obj);
} // BW_Conv::Obj2Array
class Foo
{
private $foo;
protected $bar;
public $baz;
public function __construct()
{
$this->foo = 1;
$this->bar = 2;
$this->baz = new StdClass;
}
}
var_dump( (array) new Foo );
// ---- return associative array from object, ... use:
$new_arr1 = object_to_array_recusive($my_object);
// -- or --
// $new_arr1 = object_to_array_recusive($my_object,TRUE);
// -- or --
// $new_arr1 = object_to_array_recusive($my_object,1);
// ---- return numeric array from object, ... use:
$new_arr2 = object_to_array_recusive($my_object,FALSE);
3
通过使用类型转换,您可以解决您的问题 . 只需在返回对象中添加以下行:
$arrObj = array(yourReturnedObject);
您还可以使用以下命令为其添加新的键和值对:
$arrObj['key'] = value;
7
自定义函数将stdClass转换为数组:
function objectToArray($d) {
if (is_object($d)) {
// Gets the properties of the given object
// with get_object_vars function
$d = get_object_vars($d);
}
if (is_array($d)) {
/*
* Return array converted to object
* Using __FUNCTION__ (Magic constant)
* for recursive call
*/
return array_map(__FUNCTION__, $d);
} else {
// Return array
return $d;
}
}
另一个将Array转换为stdClass的自定义函数:
function arrayToObject($d) {
if (is_array($d)) {
/*
* Return array converted to object
* Using __FUNCTION__ (Magic constant)
* for recursive call
*/
return (object) array_map(__FUNCTION__, $d);
} else {
// Return object
return $d;
}
}
Usage Example:
// Create new stdClass Object
$init = new stdClass;
// Add some test data
$init->foo = "Test data";
$init->bar = new stdClass;
$init->bar->baaz = "Testing";
$init->bar->fooz = new stdClass;
$init->bar->fooz->baz = "Testing again";
$init->foox = "Just test";
// Convert array to object and then object back to array
$array = objectToArray($init);
$object = arrayToObject($array);
// Print objects and array
print_r($init);
echo "\n";
print_r($array);
echo "\n";
print_r($object);
use Symfony\Component\Serializer\Encoder\JsonEncoder;
use Symfony\Component\Serializer\Normalizer\ObjectNormalizer;
use Symfony\Component\Serializer\Serializer;
$serializer = new Serializer([new ObjectNormalizer()], [new JsonEncoder()]);
$array = json_decode($serializer->serialize($object, 'json'), true);
class Test{
const A = 1;
public $b = 'two';
private $c = test::A;
public function __toArray(){
return call_user_func('get_object_vars', $this);
}
}
$my_test = new Test();
var_dump((array)$my_test);
var_dump($my_test->__toArray());
function readObject($object) {
$name = get_class ($object);
$name = str_replace('\\', "\\\\", $name); \\ Comment this line, if you dont use class namespaces approach in your project
$raw = (array)$object;
$attributes = array();
foreach ($raw as $attr => $val) {
$attributes[preg_replace('('.$name.'|\*|)', '', $attr)] = $val;
}
return $attributes;
}
27 回答
当您从数据库 - >获取数据作为对象时,您可能希望这样做
有我的建议,如果你的对象甚至包含私人成员:
对“井”代码的一些改进
请注意,如果函数是类的成员(如上所述),则必须将
__FUNCTION__
更改为__METHOD__
要将对象转换为数组,只需显式转换它
转换和删除恼人的星星:
可能它会比使用反射更便宜 .
@ SpYk3HH的简短解决方案
从第一次谷歌搜索“php对象到关联数组”我们有这个:
来源于codesnippets.joyent.com .
在这里,我创建了一个 objectToArray() 方法,它也适用于递归对象,例如当
$objectA
包含$objectB
时,它再次指向$objectA
.另外,我使用ReflectionClass将输出限制为公共属性 . 如果你不需要它,摆脱它 .
为了识别已经使用过的对象,我在这个(抽象)类中使用了一个名为
$this->usedObjects
的受保护属性 . 如果找到递归嵌套对象,则它将被字符串**recursive**
替换 . 否则它会因为无限循环而失败 .此函数可以将 object proprity 转换为 array associatif
使用> = php5
此处发布的所有其他答案仅适用于公共属性 . 这是一个使用反射和getter与javabean类对象一起使用的解决方案:
您还可以在PHP中创建函数来转换对象数组 .
由于很多人因为动态访问对象的属性而遇到这个线程,我只想指出你可以在php中执行此操作:
$valueRow->{"valueName"}
在Context中(为了便于阅读,删除了HTML输出):
如果您的对象属性是公共的,您可以:
如果它们是私有的或受保护的,它们将在阵列上具有奇怪的键名 . 因此,在这种情况下,您将需要以下功能:
这是一些代码:
只是强调它
从http://www.php.net/manual/en/language.types.array.php
Example: Simple Object
输出:
Example: Complex Object
输出(为清晰起见,编辑了\ 0s):
输出
var_export
而不是var_dump
:以这种方式进行类型转换不会对对象图进行深度转换,您需要应用空字节(如手册中所述)来访问任何非公共属性 . 因此,在仅使用公共属性转换StdClass对象或对象时,这种方法效果最佳 . 为了快速和肮脏(你要求的)它没关系 .
另见这篇深入的博文:
键入将对象转换为数组 .
它会解决你的问题 .
嗨,
这是我的递归PHP函数,用于将PHP对象转换为关联数组
用法示例:
通过使用类型转换,您可以解决您的问题 . 只需在返回对象中添加以下行:
您还可以使用以下命令为其添加新的键和值对:
自定义函数将stdClass转换为数组:
另一个将Array转换为stdClass的自定义函数:
Usage Example:
你也可以使用The Symfony Serializer Component
这个答案只是这篇文章的不同答案的结合,但它是使用关联数组中的简单值或数组转换具有公共或私有属性的PHP对象的解决方案...
您可以依靠JSON编码/解码函数的行为快速将深层嵌套对象转换为关联数组:
Output
返回没有特殊字符和类名的数组
get_object_vars($obj)
怎么样?如果您只想访问对象的公共属性,则似乎很有用 . http://www.php.net/function.get-object-vars首先,如果你需要一个来自对象的数组,你可能应该首先将数据构成数组 . 想一想 .
不要使用foreach语句或JSON转换 . 如果您正在计划这个,那么您再次使用数据结构,而不是使用对象 .
如果你真的需要它,使用面向对象的方法来保持清洁和维护码 . 例如:
对象作为数组
如果您需要所有属性使用传输对象