创建具有2个数组的对,以便没有重复对?

时间:2018-05-02 07:31:19

标签: php php-7

我正在尝试创建一个脚本来创建来自2个不同数组的对。例如,我有两个数组如下:

<?php
    //Array 1
    $arr1 = array('A', 'B', 'C', 'D');
    //Array 2
    $arr2 = array('X', 'Y', 'Z');

我需要以这样的方式输出,以便它与每个元素匹配,并且也不重复对和序列。这是预期的输出:

$output = array(
  0 => array('A', 'X'),
  1 => array('B', 'Y'),
  2 => array('C', 'Z'),
  3 => array('D', 'X'),
  4 => array('A', 'Y'),
  5 => array('B', 'Z'),
  6 => array('C', 'X'),
  7 => array('D', 'Y'),
  8 => array('A', 'Z'),
  9 => array('B', 'X'),
  10 => array('C', 'Y'),
  11 => array('D', 'Z')
)

**注意:2个数组可能会有不同的计数和值。

4 个答案:

答案 0 :(得分:1)

我认为没有内置的支持。
您需要循环嵌套的数组并构建结果数组。

$arr1 = array('A', 'B', 'C', 'D');
$arr2 = array('X', 'Y', 'Z');

foreach($arr1 as $item1){
    foreach($arr2 as $item2){
        $res[] = [$item1, $item2];
    }
}

var_dump($res);

https://3v4l.org/CdE8Q

答案 1 :(得分:1)

这是Cartesian Product。可以通过

来实现
//Array 1
$arr1 = array('A', 'B', 'C', 'D');
//Array 2
$arr2 = array('X', 'Y', 'Z');

$output = array();

foreach($arr1 as $i1){
    foreach ($arr2 as $i2) {
        $output[] = array($i1, $i2);
    }
}

echo json_encode($output);

如果您希望输出的顺序与上面提到的顺序相同,则应遵循以下顺序。

$newoutput = array();

$x = 0;
$y = 0;
for($i = 1; $i <= (count($arr1) * count($arr2)); $i++){
    $newoutput[] = array($arr1[($x % count($arr1))], $arr2[($y % count($arr2))]);
    $x++;
    $y++;
}

echo "<br />", json_encode($newoutput);

然而,输出是与先前相同的输出的不同顺序。

修改

第二项仅适用于(count($arrX) % count($arrY)) > 0

答案 2 :(得分:0)

试试这个(如果找到,这将整理出同一对):

const {User} = require('../models')
const jwt = require('jsonwebtoken')
const config = require('../config/config')

function jwtSignUser (user) {
  const ONE_WEEK = 60 * 60 * 24 * 7
  return jwt.sign(user, config.authentication.jwtSecret, {
    expiresIn: ONE_WEEK
  })
}

module.exports = {
  async register (req, res) {
    try {
      const user = await User.create(req.body)
      const userJson = user.toJSON()
      res.send({
        user: userJson
      })
    } catch (err) {
      res.status(400).send({
        error: 'This email account is already in use.'
      })
    }
  },
  async login (req, res) {
    try {
      const {email, password} = req.body
      const user = await User.findOne({
        where: {
          email: email
        }
      })

      console.log('user BEFORE', user)
      if (!user) {
        console.log('!user')
        return res.status(403).send({
          error: 'The login information was incorrect'
        })
      }

      console.log('user AFTER', user)

      const isPasswordValid = await user.comparePassword(password)
      console.log('isPasswordValid BEFORE : ', isPasswordValid)
      if (!isPasswordValid) {
        console.log('isPasswordValid AFTER : ', isPasswordValid)
        return res.status(403).send({
          error: 'The login information was incorrect'
        })
      }

      const userJson = user.toJSON()
      res.send({
        user: userJson,
        token: jwtSignUser(userJson)
      })
    } catch (err) {
      res.status(500).send({
        error: 'An error has occured trying to log in'
      })
    }
  }
}

答案 3 :(得分:0)

这是一个以相同顺序输出唯一值的示例:

在线评估:https://3v4l.org/H2pad

<form role="form">
             <div className="form-group">
                  <label htmlFor={props.recipeName}>Recipe</label>
                 <input 
                    type="text" 
                    className="form-control"
                    defaultValue={props.recipeName || ''}
                    name="recipeName"
                    placeholder="Recipe name"
                    onChange={props.handleChange.bind(this)}/>
            </div>
          <div className="form-group">
                  <label htmlFor={props.recipeIngredients}>Ingredients</label>
                  <textarea 
                    type="text" 
                    className="form-control"
                    defaultValue={props.recipeIngredients || ''}
                    placeholder="Enter ingredients separated by commas..."
                    onChange={props.handleChange.bind(this)}
                    name="recipeIngredients"></textarea>
           </div>
  </form>

(tbh,它花了我很多橡皮鸭调试)