Estoy tratando de usar la reescritura de urls en mi web y quiero usar el list() y explode() funciones para obtener el contenido correcto.
Actualmente mi código es este:

list($dir, $act) = explode('/',$url);

En este caso $url es igual a todo, después de la primera diagonal en la dirección url absoluta es decir, http://example.com/random/stuff => $url = random/stuff/ que esto iba a funcionar bien, pero si quiero ir a http://example.com/random/, a continuación, mostrará un aviso en la página. Cómo hago para dejar el aviso de muestra de hasta qué necesito para usar algo distinto de la list() función?

Ahora el aviso es «Notice: Undefined offset: 1…»

Gracias por la ayuda!

  • Las correcciones para este problema de lado, debe desactivar la visualización de errores de PHP en su sitio de producción.
InformationsquelleAutor cskwrd | 2010-03-01

8 Comentarios

  1. 8

    Usted debe comprobar cómo muchos de los segmentos de la ruta de la URL contiene:

    $segments = explode('/', $url);
    if (count($segments) !== 2) {
        //error
    } else {
        list($dir, $act) = $segments;
    }

    Pero tal vez usted debe elegir un enfoque más flexible que el uso de list.

    • ¿Cuál sería un ejemplo de un enfoque más flexible?
    • Eso depende de tus necesidades, de cómo su aplicación, esperar a recibir sus argumentos.
    • He adaptado la solución sobre el uso de un interruptor de declaración de manera más fácil lidiar con varios casos diferentes. Gracias!
  2. 13

    Intente esto :

    list($dir, $act) = array_pad(explode('/',$url), 2, '');

    array_pad completar la matriz con sus valores, aquí está : ''.

    • list($a, $b, $c) = explode('/', $url) + ['x', 'y', 'z']; tener diferentes valor por defecto.
  3. 1

    Una solución sería dividir la línea de código en varias, para asegurarse de que nunca se asigne a que no existen valores para las variables-que es lo que están haciendo cuando explode sólo devuelve una porción de la URL.

    Para que, no usando list parece la solución adecuada, ya que, con la lista, usted debe saber que muchos de los elementos de la expresión a la derecha de = volverá…

    Y, en esta situación, usted no sabe cómo muchos de los elementos explode volverá.


    Por ejemplo, algo como esto puede estar bien :

    $parts = explode('/', $url);
    if (isset($parts[0])) {
      $dir = $parts[0];
      if (isset($parts[1])) {
        $act = $parts[1];
      }
    }

    Por supuesto, depende de usted para hacer frente a la situación en la que $dir y/o $act no se establecen más adelante en la secuencia de comandos.


    Otra solución sería la de comprobar cómo muchos de los elementos explotar volverá (contando el número de / por ejemplo) ; pero usted todavía tiene que lidiar con al menos dos casos.

  4. 1

    para deshacerse de la notificación:

    list($dir, $act) = explode('/',$url);

    pero tal vez la mejor solución sería:

    $segments = explode ('/', $url);
    $dir = array_shift ($segments);
    $act = array_shift ($segments);

    si no hay ningún de 2ª segmento, $acto sería nulo y puede también más de 2 segmento de esta manera

  5. 1

    La forma correcta para suprimir la E_NOTICE en la lista de asignación como de PHP 5.4+ es la siguiente:

    @list($dir, $act) = explode('/', $url);

    Si $url no contiene /, explotar devolverá uno de los elementos y $act será NULL.

  6. 0

    Lugar de la explosión de la dirección URL completa, pruebe $_SERVER['PATH_INFO'], suponiendo ‘/random » con los nombres de la secuencia de comandos.

    • Downvoter: ¿qué hay de malo con PATH_INFO? La pregunta es ambigua, lo suficiente como para permitir esta posibilidad.
  7. 0

    La simple y feo respuesta es prefijo de todo, con una sola’@’, que suprime las salidas de error. $ley se establece en null en ese caso porque bajo el capó, es equivalente a:

    $foo = explode('/',$url);
    $dir = $foo[0];
    $act = $foo[1]; //This is where the notice comes from

Dejar respuesta

Please enter your comment!
Please enter your name here