#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/exit5. @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
возвращается в этом случае.