【问题标题】:PHP associative array foreachPHP 关联数组 foreach
【发布时间】:2021-01-21 20:43:28
【问题描述】:

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

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

    [1] => Array
        (
            [FF-25166] => 66326262
        )
)

第一个值是一个 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] !== $source_id

按照以下方式构建数组会更好吗?

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

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

【问题讨论】:

    标签: php arrays foreach associative-array


    【解决方案1】:

    您使数组结构过于复杂。你应该像这样构建你的数组。

    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;
    }
    

    【讨论】:

    • 非常感谢您的输入,它似乎工作正常,但在我收到不同的 $source_id 的情况下,它似乎没有将其添加到现有数组中:(
    • 我在我的测试服务器上完全设置了这段代码,除了两个更改:删除 public 关键字;在return $array1 之后添加;(这里已经纠正了错字)。它完全按照我的预期工作,包括创建新元素。我怀疑问题出在您代码中的其他地方。
    • 如果数组中有多个数据怎么办?它会对应正确的吗?
    • 如果您以这种方式构建数组,您将不会有重复的值。如果您构建了最初建议的数组,则可能会有重复项,但您也无法区分它们。您总是会更新找到的第一个值,或者将所有值更新为相同。如果重复是一个问题,您需要提供有关此数据的确切组成方式的更多详细信息。
    【解决方案2】:

    您可以使用您编写的第一个数组格式来使用 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_number 添加到数组中的键 $source_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);
    }
    

    【讨论】:

    • 感谢您的意见!如果不满足条件,我是否只是假设 source_id 不存在而添加到数组中?
    • 上面的代码只会替换你的数组元素的值,其中 $source_id 为 'ID'。结果将完全是您的第一个数组,但值 $source_number 与 ID $source_id 关联(如果不是这样的话)。我无法清楚地理解为什么您需要添加到数组中,因为您将获得的数组与您一开始的相同,而您所做的只是“替换”与您的条件不对应的值。跨度>
    • 如果数组中$source_id 不存在,只需将其添加到数组中,如果存在则需要替换现有数组中的$source_number;不知道我是否有意义:D
    • 我明白了,在这种情况下你可以做的是在你的 foreach 循环之后添加一些代码来检查 ID 是否作为数组键存在于你的数组中,使用 PHP 函数 array_key_exists($source_id, $array1)(有关此函数的更多信息,请参阅php.net/manual/en/function.array-key-exists.php)。然后,您可以执行 if 语句,如果函数 array_key_exists 返回 false(因此键不存在),您将使用 $source_id 将值添加到数组中。它看起来像“if (!array_key_exists($source_id, $array1)) { $array1[$source_id] = $source_number }”(抱歉编辑)。
    • 我刚刚编辑了我的答案,所以(我希望)对你来说更清楚:)
    【解决方案3】:

    首先,我假设您正在传递问题顶部显示的数组。因此将采用以下形式:

    $array = [
        ['AA' => 111],
        ['AB' => 111],
        ['AC' => 111],
        ['AD' => 111],
        ['AE' => 111],
        ['AA' => 112]
    ];
    

    假设这是正确的,那么您的 if 语句不起作用:

    $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;
    

    收件人:

    foreach ($array1 as &$array)
    
    $array = [$source_id => $source_number];
    

    所以,您的代码现在部分工作;如果我们调用该函数,它将更新现有的 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_number 匹配,我们只需将值更新为$source_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;
    }
    

    虽然,有了这个简化的数组......你甚至需要把更新放在一个函数/方法中吗?我想这取决于您的其余代码。

    【讨论】:

    • 非常感谢您的深入回答,这让我的头脑更加清晰,我完全把整个情况复杂化了:)
    猜你喜欢
    • 1970-01-01
    • 2015-11-09
    • 1970-01-01
    • 2011-04-26
    • 2014-10-01
    • 1970-01-01
    • 2014-08-12
    • 1970-01-01
    • 2016-10-31
    相关资源
    最近更新 更多