Modificar Array multidimensional sin indices

  • Autor Autor shadowhck
  • Fecha de inicio Fecha de inicio
shadowhck

shadowhck

Lambda
Programador
Verificado por Whatsapp
hola

Tengo un ligero problema de semanas. Tengo un Array multidimensional que no usa muchos indices, quiero modificar solo algunos valores de este, pero no puedo si quiera obtener el valor que necesito directamente. Foreach me ha facilitado la cosa pero es más complicado.

Tengo el siguiente output hecho con var_dump del array, y quisiera saber la forma de eliminar cada Array que contenga el Array con la key 'ckeditor'. 😕

PHP:
<?php

array(16) {
  [0]...
  [1]...
  [2]...
  [3]=>
  array(1) {
    ["ckeditor"]=>
    array(2) {
      ...
    }
  }
  [4]=>
  array(1) {
    ["ckeditor"]=>
    array(1) {
      ["textarea_default_format"]=>
      array(1) {
        ["edit-comment-body-und-0-value"]=>
        string(13) "html_completo"
      }
    }
  }
  [5]...
}

Gracias.

- - - Actualizado - - -

Encontré la solución, por si a alguien le interesa:

PHP:
<?php

      $n = 0;
      while ( is_array($var['settings']['data'][$n]) ) {
        if ( is_array($var['settings']['data'][$n]['ckeditor']) ) {
          unset($var['settings']['data'][$n]);
        }
        $n++;
      }

😎
 
Al ver tu código me ha dolido los ojos, mejor usa el siguiente código:

PHP:
foreach( $array as $key => $value ) {

    if ( ! is_array( $value ) )
        continue;

    if ( ! array_key_exists( 'ckeditor', $value ) )
        continue;

    unset( $array[$key] );

} // foreach

Como ejemplo, el $array de entrada es:

PHP:
$array = [
    'Lorem',
    'ipsum',
    'dolor',
    [
        "ckeditor" => [
            'foo',
            'bar',
        ],
    ],
    'sit',
    [
        "ckeditor" => [
            'Lorem',
            'ipsum',
        ],
    ],
    'amet',
    'consectetur',
    [

        'dolor',
        'sit',
    ],
    'adipiscing',
    [
        "ckeditor" => [
            'bar',
            'foo',
        ],
    ],
    [
        "ckeditor" => [
            'ipsum',
            'Lorem',
        ],
    ],
    'elit',
];

y el que devuelve es:

PHP:
[
    'Lorem',
    'ipsum',
    'dolor',
    'sit',
    'amet',
    'consectetur',
    [

        'dolor',
        'sit',
    ],
    'adipiscing',
    'elit',
];
 
por qué te ha dolido los ojos?
la complejidad computacional de ambos es parecida (pero la tuya tiene más complejidad), por lo que las soluciones son válidas pero la de él es más óptima, el tuyo se ve más ordenado pero son iguales y funcionan ambas.
Un saludo
 
Es más, en mi código se puede reducir más todavía:

PHP:
foreach( $array as $key => $value ) { 

    if ( ! is_array( $value ) || ! array_key_exists( 'ckeditor', $value ) ) 
        continue; 

    unset( $array[$key] ); 

} // foreach

En relación a la complejidad. En mi caso no hace falta crear una variable para crear un conteo... a parte de que para recorrer un Array, lo ideal es un foreach(). Otro ejemplo, según está escrito su código en el while(), si alguna llave no es Array, el bucle se para, y por lo tanto, no limpia el resto del Array.
 
Pues ya la verdad no creo que ninguno de los 2 funcione correctamente.

Primero, no veo que ninguno sirva para Arrays multidimensionales en general (solo funcionan para un número de dimensiones fijas).
El primero de seguro le va a estar tirando un montón de de Notice de que no existe el indice "ckeditor".
Y en ambos, solo con que exista ese indice, eliminan todo los demás elementos. (Aquí no estoy seguro si es así como lo quiere el usuario)

Tampoco estoy seguro de que el indice "ckeditor" tienen que ser a fuerzas un Array para eliminar el contenedor o solo con que exista ese indice. (si es así, la segunda no funcionaría correctamente)
 
Última edición:
la complejidad computacional no se mide en el mejor de los casos, sino imagínate pondríamos puntos de parada y con eso aseguraríamos que todos los algoritmos tengan complejidad lineal, poner y reducir dos líneas en una no optimiza ni es la mejor solución pero si es válida tu argumentación cuando dices que funciona.
 
Atrás
Arriba