Это действительно становится ленивым, и трудно гарантировать ежемесячный сбор одной статьи.
В процессе недавно опрашивая других, я поинтересовался некоторыми сведениями о ссылках на PHP и обнаружил, что многие студенты мало знают об этом аспекте, и многие до сих пор практически никогда не использовали его в своей работе. Мне даже сказали использовать цитаты экономно, так как цитаты могут вызвать некоторые странные проблемы. Я сказал себе, что избегание странных проблем заключается в понимании цитат, а не в их экономном использовании. Давайте анализировать и анализировать вместе сегодня.
сценарная гипотеза
Начнем с так называемой причудливой проблемы. Предположим, у нас такой сценарий: мы читаем набор данных заказа из базы данных, и нам нужно сделать некоторую обработку для каждого из данных заказа отдельно.
$orders = [
['orderid' => '123', 'total_fee' => 10, 'name' => 'zhangsan'],
['orderid' => '456', 'total_fee' => 17, 'name' => 'lisi'],
['orderid' => '789', 'total_fee' => 14, 'name' => 'wangwu'],
];
foreach ($orders as &$item) {
// 对订单做了些什么处理
}
// 有了一些其它操作
$result = [];// 需要返回的结果
foreach ($orders as $item) {// 重新映射名字
$result[] = [
'order_id' => $item['orderid'],
'amount' => $item['total_fee'],
];
}
Приведенная выше программа выведет следующий результат:
var_dump($result);
array(3) {
[0]=>
array(2) {
["order_id"]=>
string(3) "123"
["total_fee"]=>
int(10)
}
[1]=>
array(2) {
["order_id"]=>
string(3) "456"
["total_fee"]=>
int(17)
}
[2]=>
array(2) {
["order_id"]=>
string(3) "456"
["total_fee"]=>
int(17)
}
}
Это так называемая странная проблема, которая часто встречается: сначала данные обрабатываются эталонным циклом, а затем та же временная переменная, что и эталон, используется для продолжения обработки данных. Вот:$item
. Многие студенты сказали, что для предотвращения такого рода проблем необходимо использовать меньше ссылок. Такое отношение слишком негативное, ссылки во многих местах упрощают написание кода, а использование ссылок для больших массивов может сэкономить много памяти.
Странный анализ проблемы
Теперь разберем причины вышеуказанных проблем. Сначала посмотрите на определение ссылки
Ссылка означает доступ к одному и тому же содержимому переменной с другим именем.
то в этой части кода
foreach ($orders as &$item) {
// 对订单做了些什么处理
}
$item
Наконец с$orders[2]
указывает на одно и то же переменное содержимое. И вforeach
После завершения цикла,$item
Он не был уничтожен, поэтому, если он будет иметь такое же имя в будущем, он продолжит действовать. Схема выглядит следующим образом:
Потом в следующем цикле.
foreach ($orders as $item) {// 重新映射名字
$result[] = [
'order_id' => $item['orderid'],
'amount' => $item['total_fee'],
];
}
в любое время$orders
присвоить переменную$item
, оба изменились одновременно$orders[2]
значение . Отсюда странная ситуация выше. Позвольте мне показать вам шаг за шагом:
- первый цикл
$orders[0]
,$item
направлениеorderid=123
порядок, из-за$item
да$orders[2]
, что приводит к$orders[2]
также указал наorderid=123
заказ; - второй цикл
$orders[1]
,$item
направлениеorderid=456
порядок, так$orders[2]
также указал наorderid=456
; - третий цикл
$orders[2]
, видно, что его значение сталоorderid=456
порядок.
Благодаря приведенному выше анализу я считаю, что у каждого есть понимание так называемой странности. Так как же избежать этой ситуации? На самом деле это очень просто, после каждого использования ссылки не забывайтеunset
Ссылка на звонок. Вы можете продолжать использовать его без колебаний. Конкретно в этом примере:
foreach ($orders as &$item) {
// 对订单做了些什么处理
}
unset($item);
// 有了一些其它操作
foreach ($orders as $item) {// 重新映射名字
}
Волшебное использование цитирования
Как я уже говорил, цитаты делают код кратким. Использование классификации с бесконечным уровнем является одним из сценариев использования. Например, у нас есть классифицированные данные:
$catList = [
'1' => ['id' => 1, 'name' => '颜色', 'parent_id' => 0],
'2' => ['id' => 2, 'name' => '规格', 'parent_id' => 0],
'3' => ['id' => 3, 'name' => '白色', 'parent_id' => 1],
'4' => ['id' => 4, 'name' => '黑色', 'parent_id' => 1],
'5' => ['id' => 5, 'name' => '大', 'parent_id' => 2],
'6' => ['id' => 6, 'name' => '小', 'parent_id' => 2],
'7' => ['id' => 7, 'name' => '黄色', 'parent_id' => 1],
];
Если я хочу получить следующую форму
$result = [
['id' => 1, 'name' => '颜色', 'children' => [
['id' => 3, 'name' => '白色'],
['id' => 4, 'name' => '黑色'],
['id' => 7, 'name' => '黄色']
]],
['id' => 2, 'name' => '规格', 'children' => [
['id' => 5, 'name' => '大'],
['id' => 6, 'name' => '小']
]]
];
Если вы используете ссылки, вы можете получить результат очень просто.
$treeData = [];// 保存结果
foreach ($catList as $item) {
if (isset($catList[$item['parent_id']]) && ! empty($catList[$item['parent_id']])) {// 肯定是子分类
$catList[$item['parent_id']]['children'][] = &$catList[$item['id']];
} else {// 肯定是一级分类
$treeData[] = &$catList[$item['id']];
}
}
Вы можете попробовать метод без ссылки, реализовать бесконечный уровень и сравнить код.
Это конец года. У меня нет денег, чтобы раздать всем красный конверт и всем порекомендовать хорошую компанию в Шанхае. Помогите всем прыгнуть с корабля.
Сайт компании: https://www.yimishiji.com/
Мобильный сайт: https://m.yimishiji.com/
В настоящее время компания нанимает старшего инженера PHP, которому требуются:
- Опыт разработки на PHP от 2-5 лет;
- степень бакалавра;
- Знакомы хотя бы с одним из фреймворков Laravel и Yii2;
- Дополнительные баллы за опыт работы в сфере электронной коммерции и свежих продуктов;
- Бонусные баллы за блоги и GitHub.
Щедрое отношение: пять социальных страховок и один жилищный фонд; ежедневные закупки остатков пестицидов, органических ингредиентов и фруктов; зарплата 15-30 тысяч.
Компания использует синтаксис PHP7 и агрессивно относится к новым технологиям. Для друзей в Шанхае или тех, кто хочет поехать в Шанхай, настоятельно рекомендуется посетить.
- Адрес компании: One Meter Market, Block B, Zhongshan International Plaza, № 789, Tianshan West Road, Changning District, Shanghai
- Электронная почта технического директора: alex.chang@yimishiji.com