将问题分解为更小的问题。
我们将使用的数组是:
$array = [1, 2, 3, 4, 5];
第一件事:
了解问题
为了比较左侧和右侧,您需要拆分数组,直到两边的总和相等,或者直到没有更多要求和的项目。
视觉上看起来像这样:
• ••••
•• •••
••• ••
•••• •
问题:可以把数组分成两部分吗?
了解您正在尝试做的事情是否可能,或者这样做是否有意义总是一个好主意。
对于这个问题,我们需要在数组中至少有 2 个项目才能将其分成两部分。因此,如果数组中的项目少于 2 个,那么我们可以安全地返回 false 并收工:
if (count($array) < 2) {
return false;
}
问题:如何遍历数组
数组需要在数组中的每一项之后进行拆分。所以,我们需要逐项遍历数组。
| • | • | • | • | • |
0 1 2 3 4 5
我们只需要在1、2、3和4处拆分数组。也就是说,我们应该在第一项之后开始,在最后一项之前停止:
$length = count($array);
for ($i = 1; $i < $length; $i++) {
echo "Split after {$i}\n";
}
问题:如何从数组中获取左侧/右侧
获取左侧和右侧是从数组中提取它们的简单问题。
$left = array_slice($array, 0, $i);
$right = array_slice($array, $i);
如果你把它放到循环中并输出它,你会得到这样的东西:
1 | 2 3 4 5
1 2 | 3 4 5
1 2 3 | 4 5
1 2 3 4 | 5
问题:求和和比较
PHP 有一个 array_sum() 函数,可以对数组中的值求和:
if (array_sum($left) === array_sum($right)) {
return true;
}
一个解决方案
function my_func($array) {
if (count($array) < 2) {
return false;
}
$length = count($array);
for ($i = 1; $i < $length; $i++) {
$left = array_slice($array, 0, $i);
$right = array_slice($array, $i);
if (array_sum($left) === array_sum($right)) {
return true;
}
}
return false;
}
var_dump(my_func([1, 2, 3, 4, 5])); // false
var_dump(my_func([7, 1, 2, 3, 1])); // true: 7 = (1 + 2 + 3 + 1)