PHP关联数组foreach

PHP关联数组foreach,php,arrays,foreach,associative-array,Php,Arrays,Foreach,Associative Array,我需要在以下数组上循环,但我们可以假设在某些情况下该数组可以为空: Array ( [0] => Array ( [AA562-FS] => 521502151 ) [1] => Array ( [FF-25166] => 66326262 ) ) 第一个值是一个ID,另一个值是一个数字,我从另一个源输入了这两个值,我需要在数组上循环

我需要在以下数组上循环,但我们可以假设在某些情况下该数组可以为空:

Array
    (
    [0] => Array
        (
            [AA562-FS] => 521502151
        )

    [1] => Array
        (
            [FF-25166] => 66326262
        )
)
第一个值是一个ID,另一个值是一个数字,我从另一个源输入了这两个值,我需要在数组上循环,如果ID等于另一个源的ID,并且它的值,则该数字不等于源的数字,我需要替换该数字

否则,我只是添加到现有阵列上,但我现在有一些问题,这就是我到目前为止的问题:

 public function addToken($array1, $source_id, $source_number)
{
    if (!empty($array1)) {
        foreach ($array1 as $array) {
            if ($array[0] == $source_id && $array[1] !== $source_number) {
                $array1[1] = $source_number;
            }
        }
    }
    $new_array = json_encode($array1, 1);
}
如果不相等,还需要找出如何添加值
$array[0]!==$源代码id

按照以下方式构建阵列是否更好

Array
    (
    [0] => Array
        (
            [id] => AA562-FS
            [number] => 521502151
        )

    [1] => Array
        (
            [id] => AAAD-wwww
            [number] => 1166777
        )
)

你把数组结构复杂化了。您应该像这样构建阵列

Array
(
        [AA562-FS] => 521502151
        [FF-25166] => 66326262
) 
这简化了更新所需的代码:

 public function addToken($array1, $source_id, $source_number)
{
    // Assign the source number to the array element. 
    // If the array element does not exist it's created.
    // If it does exist, the source number is updated. 
    // (If the number is the same it's updated to the same number - OK!)

    $array1[$source_id] = $source_number;
    return $array1;
}
您可以使用您编写的第一个数组格式,使用foreach($array as$index=>$value)循环。它将在数组的每个元素上迭代,在每次迭代中,$index变量将对应于您的“ID”,而$value变量对应于值

在您的情况下,它将如下所示:

foreach ($array1 as $index => $value) {
    if ($index == $source_id && $value !== $source_number) {
        $array1[$index] = $source_number;
    }
}

编辑:如果要将值$source\u number添加到数组中的键$source\u id(如果不存在),则应使用以下函数:

public function addToken($array1, $source_id, $source_number)
{
    if (!empty($array1)) {
        foreach ($array1 as $index => $value) {
            if ($index == $source_id && $value !== $source_number) {
                $array1[$index] = $source_number;
            }
        }
        /* After you looped through your array, 
         * check if the id $source_id exists or not, and if not, 
         * insert it in your array:
         */
        if (!array_key_exists($source_id, $array1)) {
            $array1[$source_id] = $source_number;
        }
    }
    $new_array = json_encode($array1, 1);
}

首先,我假设您正在通过问题顶部显示的数组。因此,其形式如下:

$array = [
    ['AA' => 111],
    ['AB' => 111],
    ['AC' => 111],
    ['AD' => 111],
    ['AE' => 111],
    ['AA' => 112]
];
假设这是正确的,那么您的
如果
语句不起作用:

$array[0] == $source_id && $array[1] !== $source_number

// $array[0] && $array[1] simply don't exist! Referencing them should
// throw a notice in PHP...


// In the first foreach loop $array looks as follows

$array = ['AA' => 111];

// In the second loop it will be

$array = ['AB' => 111];

// and so on through the array. The index, in this case, is AA, AB, AC etc.
// the indexes 0 and 1 just don't exist
在这种情况下,我们可以通过将if语句修改为:

key($array) == $source_id && current($array) !== $source_number
当然,我们还需要更新这两行:

foreach ($array1 as $array)

$array1[1] = $source_number;
致:

因此,您的代码现在部分工作;如果我们调用该函数,它将更新现有的ID值,但不会添加新的ID值

// Notice we pass $array by reference( & ) so that it updates the original array
// if you prefer not to do this then, obviously, you need to return the updated array

function addToken(&$array, $source_id, $source_number)
{
    if (!empty($array)) {
        foreach ($array as &$arr) {
            if(key($arr) == $source_id && current($arr) != $source_number) {
                $arr = [$source_id => $source_number];
            }
        }
    }
}

addToken($array, "AB", 112);

// Updated array...
$array = [
    ['AA' => 111],
    ['AB' => 112],
    ['AC' => 111],
    ['AD' => 111],
    ['AE' => 111],
    ['AA' => 112]
];
添加不存在的项目

为此,我们需要首先查看整个数组,看看是否有匹配项,如果没有匹配项,最后添加一个新项

function addToken(&$array, $source_id, $source_number)
{
    if(!empty($array)){
        $tokenExists = false;
        foreach($array as &$arr){
            if(key($arr) == $source_id){
                $arr = [$source_id => $source_number];
                $tokenExists = true;
            }
        }

        if(!$tokenExists){
            $array[] = [$source_id => $source_number];
        }
    }
}
注意,我们不需要检查该值是否匹配
$source\u number
,我们只需将该值更新为
$source\u number
,无论哪种方式,我们都会得到相同的结果


但是除非您的输入数组中存在重复项(如图所示,在我上面使用的示例中故意重复),其中原始数组中的ID可能有多个值,所有这些值都需要更新为新值。这一切都不需要@TP有正确的想法

将格式简化为:

$array = [
    'AA' => 111, // Note this value is effectively overwritten by the last line of the arrray, you can't have duplicate keys
    'AB' => 111,
    'AC' => 111,
    'AD' => 111,
    'AE' => 111,
    'AA' => 112
];

function addToken(&$array, $source_id, $source_number)
{
    $array[$source_id] = $source_number;
}

尽管如此,使用这个简化的数组。。。您甚至需要将更新放在函数/方法中吗?我想这取决于代码的其余部分。

非常感谢您的输入,它似乎工作正常,但如果我收到不同的$source\u id,它似乎不会将其添加到现有数组中:(我在我的测试服务器上设置了这段代码,除了两个更改:删除
public
关键字;在
返回$array1
之后添加
(这里已经更正了输入错误)。它完全按照我的预期工作,包括创建新元素。我怀疑问题出在代码的其他地方。如果数组中有多个数据,会发生什么情况?它是否与正确的数据相对应?如果以这种方式构建数组,则不会有重复的值。如果构建数组,您最初建议可以ave重复项,但您也无法区分它们。您总是会更新找到的第一个值,或者更新所有值使其相同。如果重复项是一个问题,您需要提供有关此数据是如何构成的更多详细信息。感谢您的输入!如果不满足条件,我是否只需添加到数组中在源代码处,id不存在?上面的代码将只替换数组中具有$source\u id的元素的值作为“id”。结果将恰好是您的第一个数组,但与id$source\u id关联的值为$source\u number(如果还没有)。我无法清楚地理解您为什么需要添加到阵列中,因为您将得到的阵列与开始时相同,您所做的只是“替换”该值与您的条件不对应。如果数组中不存在$source\u id,请将其添加到数组中,如果存在,则需要替换现有数组中的$source\u编号;不知道我是否有意义:我明白了,在这种情况下,您可以做的是在foreach循环后添加一些代码,以检查该id是否作为数组键存在在数组中,使用PHP函数array_key_exists($source_id,$array1)(有关此函数的更多信息,请参阅)。然后可以执行if语句,如果函数array_key_exists返回false(因此该键不存在),则使用$source_id将值添加到数组中。它看起来像“if(!array_key_exists($source\u id,$array1)){$array1[$source\u id]=$source\u number}(很抱歉编辑)。您能确认一下吗?我添加了一个编辑:)非常感谢您的深入回答,这让我的头脑更清晰了,我完全完成了整个情况:)
$array = [
    'AA' => 111, // Note this value is effectively overwritten by the last line of the arrray, you can't have duplicate keys
    'AB' => 111,
    'AC' => 111,
    'AD' => 111,
    'AE' => 111,
    'AA' => 112
];

function addToken(&$array, $source_id, $source_number)
{
    $array[$source_id] = $source_number;
}