Установка значения массива через возвращаемое значение функции

#php #arrays

#php #массивы

Вопрос:

У меня есть массив, значения которого динамически получаются из функции (или должны быть), вы можете увидеть Пример ниже. Но, похоже, это работает не так, как ожидалось. Это неправильное использование?

 $products = array(
    "saloon" => array(
        array(
            "id"    => "23544",
            "precise"   => "unkown",
            "pump"  =>  "auto",
            "density"   =>  "5:3",
            "name"      =>  "Multi dose arranger",
            "color"     =>  "224,0,92",
            "desc"      =>  "....",
            "cdate"     =>  "12342315",
            "support"   =>  "#lab"
        )// Goes like this.
      )
    ),

    "basic" => array(
        //Goes on and on
    ),

    "variable"  => array(
    )
);
array(
    2=> array(
        getProduct(16,"everyday"),
        getProduct(24,"everyday")
    ),
    3=> array(
        getProduct(16,"everyday"),
        getProduct(23,"everyday")
    ),
    4=> array(
        getProduct(16,"everyday"),
        getProduct(24,"everyday")
    )
);



function getProduct($id,$cat){
    GLOBAL $products,$a;
//  echo $a;
//  print_r(is_array($products));


    foreach ($products[$cat] as $product) {
        if($product["id"]==$id){
            $selectedProduct = $product;
            break;
        }
    }
    return $selectedProduct;

}
  

функция похожа на описанную выше, но ничего не устанавливает, также вывод массива также возвращает пустой.

Комментарии:

1. что это за функция? также с какой проблемой вы столкнулись?

2. Вы говорите it doesn't work as expected — что происходит??

3. просто ничего, не устанавливает значение.

4. Пожалуйста, RTFM, что exit делает. php.net/exit

5. @deceze спасибо за ваш «добрый» ответ. в любом случае, я изменил exit на break, но проблема в том, что даже print_r($products) не работает, а просто вызов функции вне массива работает так, как ожидалось.

Ответ №1:

Измените свою функцию для этого:

 function getProduct($id,$cat){
    global $products,$a;    

    foreach ($products[$cat] as $product) {
        if($product["id"]==$id){
            $selectedProduct = $product;
            break; //Instead of exit
        }
    }
    return $selectedProduct;
}
  

Не используйте exit , потому что вы хотите прервать выполнение foreach, а не выйти из программы, используйте break вместо этого.

РЕДАКТИРОВАТЬ: исправлено, что делает функция выхода, благодаря @deceze

Комментарии:

1. exit не только «завершает работу функции», но и завершает всю программу.

2. Моя ошибка, я изменил exit на break, но print_r($products); ничего не выводит на экран.

3. @siniradam Обновите свой ответ всем кодом и внесенными вами изменениями

4. @siniradam В этом примере a получает десятки уведомлений, потому что «everyday» не является допустимым индексом.

5. Если я изменю индекс для «saloon» и идентификатор примера массива с «23544» на «16», то результат будет таким, как ожидалось… в чем проблема сейчас?

Ответ №2:

Что вы делаете неправильно, так это используете exit внутри вашей функции (это останавливает выполнение всего скрипта). Вы должны изменить свою функцию на:

 function getProduct($id,$cat){
    global $products,$a;
//  echo $a;
//  print_r(is_array($products));


    foreach ($products[$cat] as $product) {
        if($product["id"]==$id){
            return $product;
        }
    }
    return false;
}
  

На самом деле вам не нужен exit или break, потому что вы можете просто вернуться $product , когда найдете его. Вы также должны возвращать значение в случае, если вы не нашли какой-либо продукт. В приведенном выше примере false возвращается в этом случае.