modificar - llenar array multidimensional php
Desplazamiento no definido al acceder al elemento de matriz que existe (7)
¿Cómo imprimiste la matriz? Sugeriría print_r($arrayName);
A continuación, puede imprimir elementos individuales como: echo $arrayName[0];
Tengo una matriz y PHP, y cuando los imprimo puedo ver los valores a los que necesito acceder, pero cuando intento acceder a ellos por su clave obtengo un aviso de PHP. Imprimí la matriz con print_r :
Array
(
[207] => sdf
[210] => sdf
)
Cuando trato de acceder a la matriz usando el índice obtengo un aviso de compensación indefinido. Aquí está mi código:
print_r($output);
echo $output[207]; // Undefined Offset
echo $output["207"]; // Undefined Offset
La matriz $output
es el resultado de una llamada a array_diff_key y se array_diff_key originalmente como JSON a través de una solicitud HTTP POST.
array_keys me da lo siguiente:
Array
(
[0] => 207
[1] => 210
)
En respuesta a los comentarios:
var_dump(key($output));
productos:
string(3) "207"
var_dump(isset($output[key($output)]));
productos:
bool(false)
Acabo de encontrar este error que hace que los elementos de la matriz sean inaccesibles a veces en PHP cuando la matriz se crea mediante una llamada para unserialize .
Cree un archivo PHP de prueba que contenga (o ejecute desde la línea de comando) el siguiente script:
<?php
$a = unserialize(''a:2:{s:2:"10";i:1;s:2:"01";i:2;}'');
print $a[''10'']."/n";
$a[''10''] = 3;
$a[''01''] = 4;
print_r($a);
foreach ($a as $k => $v)
{
print ''KEY: '';
var_dump($k);
print ''VAL: '';
var_dump($v);
print "/n";
}
Si obtiene errores, tiene una versión de PHP con este error y le recomiendo que actualice a PHP 5.3
Consulte esta sección sobre la conversión de un objeto a una matriz en el Manual de PHP :
Las claves son los nombres de las variables miembro, con algunas excepciones notables: las propiedades enteras son inaccesibles ; las variables privadas tienen el nombre de clase antepuesto al nombre de la variable; las variables protegidas tienen un ''*'' antepuesto al nombre de la variable.
Al convertir a una matriz de un objeto en PHP, las claves de matriz entera se almacenan internamente como cadenas. Cuando accede a los elementos de la matriz en PHP o usa una matriz normalmente, las claves que contienen enteros válidos se convertirán en enteros automáticamente. Un entero almacenado internamente como una cadena es una clave inaccesible.
Tenga en cuenta la diferencia:
$x = (array)json_decode(''{"207":"test"}'');
var_dump(key($x)); // string(3) "207"
var_dump($x);
// array(1) {
// ["207"]=>
// string(4) "test"
// }
$y[''207''] = ''test'';
var_dump(key($y)); // int(207)
var_dump($y);
// array(1) {
// [207]=>
// string(4) "test"
// }
print_r en ambas matrices da salida idéntica, pero con var_dump puedes ver las diferencias.
Aquí hay un código que reproduce su problema exacto:
$output = (array)json_decode(''{"207":"sdf","210":"sdf"}'');
print_r($output);
echo $output[207];
echo $output["207"];
Y la solución simple es pasar en true
a json_decode para el argumento opcional assoc
, para especificar que desea una matriz, no un objeto:
$output = json_decode(''{"207":"sdf","210":"sdf"}'', true);
print_r($output);
echo $output[207];
echo $output["207"];
El problema surge cuando se casting a la array
un objeto que tiene claves de cadena que son enteros válidos.
Si tienes este objeto:
object(stdClass)#1 (2) {
["207"]=>
string(3) "sdf"
["210"]=>
string(3) "sdf"
}
y lo lanzas con
$array = (array)$object
obtienes esta matriz
array(2) {
["207"]=>
string(3) "sdf"
["210"]=>
string(3) "sdf"
}
que tiene claves a las que solo se puede acceder al recorrerlas, ya que un acceso directo como $array["207"]
siempre se converted a $array[207]
, que no existe.
Ya que está obteniendo un objeto como el anterior de json_decode()
aplicado a una cadena como
$json = ''{"207":"sdf", "210":"sdf"}''
La mejor solución sería evitar las teclas numéricas en primer lugar. Probablemente se modelen mejor como propiedades numéricas de una matriz de objetos:
$json = ''[{"numAttr":207, "strAttr":"sdf"}, {"numAttr":210, "strAttr":"sdf"}]''
Esta estructura de datos tiene varias ventajas sobre la actual:
- refleja mejor los datos originales, como una colección de objetos que tienen una propiedad numérica
- es fácilmente extensible con otras propiedades
- es más portátil en diferentes sistemas (como puede ver, su estructura de datos actual está causando problemas en PHP, pero si utiliza otro idioma, puede encontrar fácilmente problemas similares).
Si se necesita un mapa de propiedades → objetos, se puede obtener rápidamente, por ejemplo, de esta manera:
function getNumAttr($obj) { return $obj->numAttr; } // for backward compatibility
$arr = json_decode($json); // where $json = ''[{"numAttr":...
$map = array_combine(array_map(''getNumAttr'', $arr), $arr);
La otra solución sería hacer lo que sugería la json_decode()
: forzar json_decode()
a generar matrices asociativas en lugar de objetos, estableciendo su segundo parámetro en true
:
$map = json_decode($json, true);
Para sus datos de entrada esto produce directamente
array(2) {
[207]=>
string(3) "sdf"
[210]=>
string(3) "sdf"
}
Tenga en cuenta que las teclas de la matriz son ahora enteros en lugar de cadenas.
Sin embargo, consideraría cambiar la estructura de datos JSON por una solución mucho más limpia, aunque entiendo que podría no ser posible hacerlo.
Prueba usar mi enfoque:
class ObjectToArray {
public static function convert( $object ) {
if( !is_object( $object ) && !is_array( $object ) ) {
return $object;
}
if( is_object( $object ) ) {
$object = get_object_vars( $object );
}
return array_map( ''ObjectToArray::convert'', $object );
}
}
$aNewArray = ObjectToArray::convert($oYourObject);
Simplemente ponga error_reporting (0); en su método o al inicio del archivo. Solucionará tu problema.
Tratar
var_dump($output);
foreach ($output as $key => val) {
var_dump($key);
var_dump($val);
}
para aprender más sobre lo que está sucediendo.
¿Qué línea / declaración exacta te está lanzando una advertencia?