La función solo devuelve la primera matriz

Estoy tratando de agregar algunas configuraciones a mi página de opciones de WordPress que dependen de la cantidad de categorías. Creé esta función para usar dentro de la matriz principal, pero solo devuelve la primera matriz, dejando fuera las otras 3 que tengo. A print_r los mostrará todos, por lo que parece que no puedo resolver esto.

function listSections() {
  $categories = get_categories();
    foreach($categories as $category) {
      return array (
        "name" => $category->cat_name . " Label Color",
        "desc" => "Select a label color.",
        "id" => $shortname."_label_color" . $category->cat_ID,
        "type" => "select",
        "options" => $color_options,
        "std" => ""
      );
    }
}

preguntado el 27 de agosto de 11 a las 16:08

Regresas dentro de un bucle. Eso provocará el comportamiento que describe. Debe agregar cada hit a una matriz temporal y devolverlo después del bucle:

Piensa un poco más en lo que return lo hace. -

4 Respuestas

¡Solo puedes regresar una vez!

function listSections() {
  $categories = get_categories();
  $return = array();
    foreach($categories as $category) {
      $return[] = array (
        "name" => $category->cat_name . " Label Color",
        "desc" => "Select a label color.",
        "id" => $shortname."_label_color" . $category->cat_ID,
        "type" => "select",
        "options" => $color_options,
        "std" => ""
      );
    }
    return $return;
}

La solución es insertar cada matriz en una matriz temporal y luego devolver esa matriz al final del ciclo.

Respondido 27 ago 11, 20:08

@Fraser No fue cuando empecé a escribir. - Mateo

Para que funcione, cada matriz debe agregarse a la matriz principal individualmente, por lo que devolver la matriz (matriz ()) no funcionará. - Norbert

@Norbert Usa tu cabeza. Hay un número infinito de soluciones para ese problema, por ejemplo, pasar la matriz principal por referencia y enviar nuevas matrices a eso: listSections(&$mainarray) { ... $mainarray[] = array(... - Mateo

@Fraser ¿Desde cuándo fue esa una razón aceptable para rechazar la respuesta de todos modos? Solo debe votar en contra si no responde la pregunta o es inexacto. - Treffynnon

lo siento, no quise irme, me disculpo ... revocaré la votación lo antes posible. Me levanté de la cama por el lado equivocado o algo así. - Fraser

La función solo puede regresar una vez. No puede devolver varias cosas en un bucle. Después de llegar al primer retorno, sale de la función por completo. Si desea devolver una matriz de matrices, debe usar lo siguiente.

function listSections() {
    $results = array();
    $categories = get_categories();

    foreach($categories as $category) {
        $results[] = array (
        "name" => $category->cat_name . " Label Color",
        "desc" => "Select a label color.",
        "id" => $shortname."_label_color" . $category->cat_ID,
        "type" => "select",
        "options" => $color_options,
        "std" => ""
        );
    }

    return $results;
}

usando la sintaxis $ resultado [] = xyz; agregará xyz al final de la matriz. Puede recorrer la matriz devuelta, con algún código como

$results = listSections();

$count = count($results);
for ($i = 0; $i < $count; $i++) {
    $category = $results[$i];
    echo $category["name"];
    etc......
}

Respondido 27 ago 11, 20:08

¿Hay alguna manera de devolver cada matriz por separado (no dentro de otra matriz) sin usar otro bucle fuera de la función? - Norbert

La función solo puede devolver 1 valor. Para devolver varios valores, debe devolver una matriz que contenga esos valores. Incluso si pudiera devolver múltiples valores, ¿cómo accedería el programa de llamada a ellos? - Kibbee

Cuando usted llama return desde una función, siempre finaliza inmediatamente la ejecución de esa función, por lo que tan pronto como se devuelve la primera matriz, la función finaliza, por lo que solo se recupera la primera matriz.

En su lugar, podría intentar devolver una matriz multidimensional (una matriz que contiene todas las matrices que le gustaría que se devolvieran).

Respondido 27 ago 11, 20:08

El objetivo de returnpalabra clave es salir de la función. Por lo que es normal que su función solo devuelva el primer elemento. Por ejemplo, puede poner todos los elementos en una matriz y devolver esta matriz:

function listSections() {
  $categories = get_categories();
  $arr = array();
    foreach($categories as $category) {
      $arr[] =  array (
        "name" => $category->cat_name . " Label Color",
        "desc" => "Select a label color.",
        "id" => $shortname."_label_color" . $category->cat_ID,
        "type" => "select",
        "options" => $color_options,
        "std" => ""
      );
    }

    return $arr;
}

Respondido 27 ago 11, 20:08

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.