【问题标题】:PHP Create Multidimensional Array from Corresponding Counts ArrayPHP从对应的计数数组创建多维数组
【发布时间】:2018-04-14 00:16:16
【问题描述】:

使用带有以下数据和嵌套循环的 PHP (7.1),我试图让每个主机匹配 COUNTS 数组中的相应数字。

HOSTS:
Array ( 
  0 => 'example/search?results1'
  1 => 'thisone/search?results2'
  2 => 'thesetoo/search?results3'
)

COUNTS:
Array (
  0 => '3'
  1 => '5'
  2 => '7'
)

foreach ( $counts as $count ) {
  foreach ( $hosts as $host ) {
  $t = $count;
    for ($n=0; $n<$t; $n++) {
      $results[] = ++$host;
    }
  continue 2;
  }
}

echo 'THESE ARE ALL THE RESULTS:',PHP_EOL,PHP_EOL,var_dump($results);

我正在寻找的结果: 多维数组

Array (
0 => Array (
    0 => 'example/search?results1'
    1 => 'example/search?results1'
    2 => 'example/search?results1'
    )
1 => Array (
    0 => 'thisone/search?results2'
    1 => 'thisone/search?results2'
    2 => 'thisone/search?results2'
    3 => 'thisone/search?results2'
    4 => 'thisone/search?results2'
    )
2 => Array (
    0 => 'thesetoo/search?results3'
    1 => 'thesetoo/search?results3'
    2 => 'thesetoo/search?results3'
    3 => 'thesetoo/search?results3'
    4 => 'thesetoo/search?results3'
    5 => 'thesetoo/search?results3'
    6 => 'thesetoo/search?results3'
    )
)

注意每个 HOSTS 的结果数对应于 COUNTS 数组。

在上面的嵌套 for 循环中,我要么只为所有计数获取一个主机,要么为一维数组中的所有主机获取每个计数。我需要的是一个多维数组,但是嵌套的 for 循环逻辑正在逃避我。我已经尝试在循环中继续和中断,但没有运气。如果循环获得另一个计数,则它会跳过主机。如果它得到另一个主机,那么它会跳过计数。

主机或计数数组都没有模式。这些将始终相互对应,但它们将是随机字符串/数字。感谢您的帮助。

【问题讨论】:

  • 数组的预期值是什么?
  • 您在上面看到的是来自 2 个对应数组的所需输出。
  • 哇!下面所有的好答案。我正在对所有这些进行测试。只需要几个小时就可以得出最终结果。谢谢!
  • 请为这个问题投票,这样我可以获得更多的声望点。谢谢!

标签: php multidimensional-array corresponding-records


【解决方案1】:

如果$hosts$counts 的计数等于:

$result = [];
foreach ($hosts as $i => $host) {
    $result[] = array_fill(0, $counts[$i], $host);
}

【讨论】:

  • foreach ($hosts as $i =&gt; $host) {
  • 您的答案的简单性是最好的。您建议将字符串附加到每个主机字符串的末尾吗?例如,与其从第一个数组组合中仅返回 3 个相同的字符串,不如为 3 个中的每一个返回一个唯一的字符串。像这样:array(3) { [0]=> array(3) { [0 ]=> string(67) "example/search?results100" [1]=> string(67) "example/search?results200" [2]=> string(67) "example/search?results300" } } 注意每条尾巴上有 3 个不同的整数。
  • 您可以将任何字符串附加到$host 像这样$result[] = array_fill(0, $counts[$i], $host . 'example');
  • 谢谢。这适用于静态附加,但是对于每个结果,动态整数(如 100、200、300)呢?
  • 为此我们不能使用array_fill这个函数生成具有相同值的数组,所以使用for循环填充数组
【解决方案2】:

这个问题是array_map()array_fill() 的完美用法示例。

$hosts = array(
  0 => 'example/search?results1',
  1 => 'thisone/search?results2',
  2 => 'thesetoo/search?results3',
);

$counts = array(
  0 => '3',
  1 => '5',
  2 => '7',
);

$result = array_map(
    function($host, $count) {
        return array_fill(0, $count, $host);
    },
    $hosts,
    $counts
);

【讨论】:

  • 可以使用 array_map 函数将动态整数附加到主机字符串吗?例如,每个结果是否可以动态附加 100、200、300 或任何其他整数?
  • 如果明确指定,任何事情都可以做。考虑到我无法读懂你的想法。
  • 我知道我没有在问题中包含这个,但具体来说,您的array_maparray_fill 可以处理动态代码吗?我可以获取另一个动态数字数组并将它们分配给每个结果吗?
  • 有些事情可以做到(通过向array_map() 传递更多参数或使用闭包或其他方式),其他事情不能这样做。你有一个特定的用例吗?在一个新问题中描述它。
  • 谢谢,我现在发布新问题。我会把链接发给你。
【解决方案3】:

试试这个:

$hosts = array ( 
  0 => 'example/search?results1',
  1 => 'thisone/search?results2',
  2 => 'thesetoo/search?results3'
);

$counts = array (
  0 => '3',
  1 => '5',
  2 => '7'
);

$results =array();
foreach ( $counts as $count ) { 
    $key_of_count = array_search( $count, $counts ); 
    for ($i=0; $i < (int)$count; $i++) {
        $results[$key_of_count][] = $hosts[$key_of_count];
    }
}
echo "<pre>"; print_r($results); echo "</pre>";

【讨论】:

  • 在我的数据中,我有多个相同整数的计数。在您的示例中,这将相似的整数值组合在一起,但任何不同的值都会产生正确的结果。例如,如果您在上面的 COUNTS 数组中添加另一个 3,它将与相邻的 3 组合并使其成为一个只有 1 个 URL 的大数组。
【解决方案4】:

如果您正在寻找仅使用循环而不使用任何花哨的数组函数的方法,那么这可能就是您正在寻找的答案:

$result = [];

foreach($counts as $k=>$count){
  $result[$k]='';
    for($i=0; $i < $count; $i++){
        $result[$k][] = $hosts[$k];
    }
}

【讨论】:

  • 每个 URL 只返回 1 个结果,而不是 COUNTS 数组中的指定数字。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-10-26
  • 2013-10-26
  • 2014-11-03
  • 2023-03-16
  • 1970-01-01
  • 1970-01-01
  • 2013-04-21
相关资源
最近更新 更多